blob: 12161a7e7b94869505d96c3c2a1d14d9b1406cb9 [file] [log] [blame]
{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"\u6982\u8ff0","text":"<p>Java Chassis \u7ed9\u5f00\u53d1\u8005\u63d0\u4f9b\u4e00\u4e2a\u5feb\u901f\u6784\u5efa\u5fae\u670d\u52a1\u7684 JAVA SDK \u3002\u5b83\u5305\u542b\u5982\u4e0b\u7279\u6027\uff1a</p> <ul> <li>\u591a\u79cd\u5f00\u53d1\u98ce\u683c\uff0cREST(JAX-RS\u3001Spring MVC\uff09\u548c RPC</li> <li>\u591a\u79cd\u901a\u4fe1\u534f\u8bae, HTTP over Vert.x\u3001Http Over Servlet\u3001Highway \u7b49</li> <li>\u7edf\u4e00\u4e00\u81f4\u7684\u670d\u52a1\u63d0\u4f9b\u8005\u3001\u670d\u52a1\u6d88\u8d39\u8005\u5904\u7406\u94fe\uff0c\u4ee5\u53ca\u57fa\u4e8e\u5951\u7ea6\u7684\u5f00\u7bb1\u5373\u7528\u7684\u670d\u52a1\u6cbb\u7406\u80fd\u529b</li> </ul> <p>\u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7Java Chassis\u8bbe\u8ba1\u53c2\u8003\u4e86\u89e3 Java Chassis \u7684\u8bbe\u8ba1\u601d\u8def\u3002</p> <p>\u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7\u4e0b\u9762\u7684\u94fe\u63a5\u83b7\u53d6\u5176\u4ed6\u7248\u672c\u7684\u5e2e\u52a9\u6587\u6863\u3002</p> \u9002\u7528\u7248\u672c \u6b63\u5f0f\u53d1\u5e03\u5730\u5740 \u9884\u89c8\u7248\u672c\u5730\u5740 Java Chassis 3 \u4e2d\u6587, English \u4e2d\u6587, English Java Chassis 2 \u4e2d\u6587, English \u4e2d\u6587, English Java Chassis 1 \u4e2d\u6587, English \u4e2d\u6587, English"},{"location":"index.html#_2","title":"\u672f\u8bed\u8868","text":"\u7f29\u7565\u8bed \u82f1\u6587\u8bcd\u6c47 \u4e2d\u6587\u8bcd\u6c47 \u89e3\u91ca Application Application \u5e94\u7528 \u5e94\u7528\u4ee3\u8868\u4e00\u4e2a\u8f6f\u4ef6\u5e94\u7528\u7684\u903b\u8f91\u5b9e\u4f53\uff0c\u8868\u793a\u4e00\u4e2a\u6709\u4e1a\u52a1\u529f\u80fd\u5448\u73b0\u7ed9\u7528\u6237\u7684\u8ba1\u7b97\u673a\u8f6f\u4ef6\u5e94\u7528\u3002\u4e00\u4e2a\u4ee5\u5fae\u670d\u52a1\u5316\u67b6\u6784\u6784\u5efa\u7684\u5e94\u7528\u901a\u5e38\u7531\u591a\u4e2a\u5fae\u670d\u52a1\u7ec4\u6210\u3002 Service Service \u5fae\u670d\u52a1 \u5fae\u670d\u52a1\u662f\u4e00\u79cd\u8f7b\u91cf\u7ea7SOA\u67b6\u6784\uff0c\u901a\u5e38\u7528\u6765\u63cf\u8ff0\u5e7f\u6cdb\u7528\u4e8e\u4e91\u5e94\u7528\u3001\u4e92\u8054\u7f51\u5e94\u7528\u7684\u4e00\u79cd\u677e\u8026\u5408\u5206\u5e03\u5f0f\u67b6\u6784\u3002 Instance Instance \u5fae\u670d\u52a1\u5b9e\u4f8b \u4e00\u4e2a\u5fae\u670d\u52a1\u7684\u6700\u5c0f\u8fd0\u884c\u548c\u90e8\u7f72\u5355\u5143\uff0c\u901a\u5e38\u5bf9\u5e94\u4e00\u4e2a\u5e94\u7528\u8fdb\u7a0b\u3002 Provider Provider \u670d\u52a1\u63d0\u4f9b\u8005 \u5728\u5fae\u670d\u52a1\u8c03\u7528\u5173\u7cfb\u4e2d\u5904\u4e8e\u88ab\u8c03\u7528\u4e00\u65b9\u7684\u670d\u52a1\u3002 Consumer Consumer \u670d\u52a1\u6d88\u8d39\u8005 \u5728\u5fae\u670d\u52a1\u8c03\u7528\u5173\u7cfb\u4e2d\u5904\u4e8e\u8c03\u7528\u53d1\u8d77\u65b9\u7684\u670d\u52a1\u3002 Schema Schema \u5fae\u670d\u52a1\u5951\u7ea6 \u5fae\u670d\u52a1\u5951\u7ea6\u662f\u5bf9\u5916\u63a5\u53e3\u7684OpenAPI\u8868\u793a\u3002OpenAPI\u589e\u5f3a\u4e86\u5fae\u670d\u52a1\u7684\u53ef\u89c1\u6027\uff0c\u65b9\u4fbf\u670d\u52a1\u7684\u5206\u53d1\u3001\u4f7f\u7528\u548c\u6cbb\u7406\u3002 Code Style Code Style \u7f16\u7a0b\u6a21\u578b \u7f16\u7a0b\u6a21\u578b\u6307\u5982\u4f55\u8fdb\u884c\u670d\u52a1\u63a5\u53e3\u5f00\u53d1\u548c\u8c03\u7528\uff0cJava Chassis\u63d0\u4f9b\u4e86Spring Web MVC\u3001JAX RS\u7b49\u7f16\u7a0b\u6a21\u578b\u3002\u7f16\u7a0b\u6a21\u578b\u72ec\u7acb\u4e8e\u5904\u7406\u94fe\u548c\u901a\u4fe1\u6a21\u578b Filter Filter \u5904\u7406\u94fe \u5904\u7406\u94fe\u5b9a\u4e49\u4e86\u4e00\u4e2a\u8bf7\u6c42\u7684\u5904\u7406\u6d41\u7a0b\uff0c\u5305\u62ec\u7f16\u89e3\u7801\u3001\u670d\u52a1\u6cbb\u7406\u3001\u7f51\u7edc\u53d1\u9001\u7b49\u3002 Transport Transport \u901a\u4fe1\u6a21\u578b \u901a\u4fe1\u6a21\u578b\u5b9a\u4e49\u4e86\u5bf9\u8c61\u5982\u4f55\u7f16\u89e3\u7801\uff0c\u4f7f\u7528\u4ec0\u4e48\u534f\u8bae\u4f20\u8f93\u7b49\u3002Java Chassis\u63d0\u4f9b\u4e86REST\u3001HIGHWAY\u7b49\u901a\u4fe1\u6a21\u578b\u3002 Load Balance Load Balance \u8d1f\u8f7d\u5747\u8861 \u5f53\u5e94\u7528\u8bbf\u95ee\u4e00\u4e2a\u5177\u6709\u591a\u4e2a\u5b9e\u4f8b\u7684\u5fae\u670d\u52a1\u65f6\uff0c\u4f1a\u6d89\u53ca\u5230\u8def\u7531\u8d1f\u8f7d\u5747\u8861\u3002\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\uff0c\u652f\u6301\u968f\u673a\uff0c\u8f6e\u8be2\u3001\u4f1a\u8bdd\u4fdd\u6301\u548c\u57fa\u4e8e\u54cd\u5e94\u65f6\u95f4\u7684\u6743\u503c\u7b49\u591a\u79cd\u8d1f\u8f7d\u5747\u8861\u8def\u7531\u7b56\u7565\u3002 Rate Limiting Rate Limiting \u9650\u6d41 \u5f53\u8d44\u6e90\u6210\u4e3a\u74f6\u9888\u65f6\uff0c\u670d\u52a1\u6846\u67b6\u9700\u8981\u5bf9\u6d88\u8d39\u8005\u7684\u8bbf\u95ee\u8bf7\u6c42\u505a\u9650\u6d41\uff0c\u542f\u52a8\u6d41\u63a7\u4fdd\u62a4\u673a\u5236\u3002\u5728\u670d\u52a1\u6d88\u8d39\u8005\u7aef\u548c\u63d0\u4f9b\u8005\u7aef\u5747\u53ef\u8fdb\u884c\u6d41\u91cf\u63a7\u5236\u3002\u5728\u670d\u52a1\u6d88\u8d39\u7aef\uff0c\u53ef\u4ee5\u9650\u5236\u53d1\u5f80\u67d0\u4e2a\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u8bf7\u6c42\u9891\u7387\uff1b\u5728\u670d\u52a1\u63d0\u4f9b\u7aef\uff0c\u53ef\u4ee5\u9650\u5236\u6bcf\u4e2a\u5fae\u670d\u52a1\u6d88\u8d39\u7aef\u53d1\u8fc7\u6765\u7684\u8bf7\u6c42\u9891\u7387\uff0c\u4e5f\u53ef\u4ee5\u6839\u636e\u670d\u52a1\u63d0\u4f9b\u7aef\u8d44\u6e90\u6d88\u8017\u60c5\u51b5\u786e\u5b9a\u603b\u7684\u8bf7\u6c42\u9891\u7387\u9650\u5236\uff0c\u9632\u6b62\u670d\u52a1\u56e0\u8d44\u6e90\u8017\u5c3d\u800c\u5d29\u6e83\u3002 Service Degrade Service Degrade \u964d\u7ea7 \u670d\u52a1\u964d\u7ea7\u4e3b\u8981\u5305\u62ec\u5c4f\u853d\u964d\u7ea7\u548c\u5bb9\u9519\u964d\u7ea7\u4e24\u79cd\u7b56\u7565\uff1a\u5c4f\u853d\u964d\u7ea7\u662f\u6307\u5f53\u5916\u754c\u7684\u89e6\u53d1\u6761\u4ef6\u8fbe\u5230\u67d0\u4e2a\u4e34\u754c\u503c\u65f6\uff0c\u7531\u8fd0\u7ef4\u4eba\u5458/\u5f00\u53d1\u4eba\u5458\u51b3\u7b56\uff0c\u5bf9\u67d0\u7c7b\u6216\u8005\u67d0\u4e2a\u670d\u52a1\u8fdb\u884c\u5f3a\u5236\u964d\u7ea7\u3002\u5bb9\u9519\u964d\u7ea7\u662f\u6307\u5f53\u975e\u6838\u5fc3\u670d\u52a1\u4e0d\u53ef\u7528\u65f6\uff0c\u53ef\u4ee5\u5bf9\u6545\u969c\u670d\u52a1\u505a\u4e1a\u52a1\u903b\u8f91\u653e\u901a\uff0c\u4ee5\u4fdd\u969c\u6838\u5fc3\u670d\u52a1\u7684\u8fd0\u884c\u3002 Fault Tolerance Fault Tolerance \u5bb9\u9519 \u5bb9\u9519\u662f\u6d88\u8d39\u8005\u8bbf\u95ee\u670d\u52a1\u65f6\u51fa\u73b0\u5f02\u5e38\u7684\u573a\u666f\u4e0b\u7684\u4e00\u79cd\u5904\u7406\u7b56\u7565\uff0c\u51fa\u73b0\u5f02\u5e38\u540e\u7531\u670d\u52a1\u6846\u67b6\u81ea\u52a8\u9009\u62e9\u65b0\u7684\u670d\u52a1\u8def\u7531\u8fdb\u884c\u8c03\u7528\u3002 Circuit Breaker Circuit Breaker \u7194\u65ad \u5fae\u670d\u52a1\u4e4b\u95f4\u901a\u5e38\u5b58\u5728\u4f9d\u8d56\u5173\u7cfb\uff0c\u670d\u52a1\u8c03\u7528\u94fe\u8def\u53ef\u80fd\u5305\u542b\u591a\u4e2a\u5fae\u670d\u52a1\uff0c\u5982\u679c\u94fe\u8def\u4e2d\u4e00\u4e2a\u6216\u591a\u4e2a\u670d\u52a1\u8bbf\u95ee\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4f1a\u5bfc\u81f4\u5165\u53e3\u670d\u52a1\u7684\u8bf7\u6c42\u4e0d\u65ad\u5806\u79ef\uff0c\u6301\u7eed\u6d88\u8017\u66f4\u591a\u7684\u7ebf\u7a0b\u3001io\u8d44\u6e90\uff0c\u6700\u7ec8\u7531\u4e8e\u8d44\u6e90\u7d2f\u79ef\u4f7f\u7cfb\u7edf\u51fa\u73b0\u74f6\u9888\uff0c\u9020\u6210\u66f4\u591a\u670d\u52a1\u4e0d\u53ef\u7528\uff0c\u4ea7\u751f\u96ea\u5d29\u6548\u5e94\u3002\u7194\u65ad\u673a\u5236\u5c31\u662f\u9488\u5bf9\u4e0a\u8ff0\u573a\u666f\u8bbe\u8ba1\u7684\uff0c\u5f53\u67d0\u4e2a\u76ee\u6807\u670d\u52a1\u54cd\u5e94\u7f13\u6162\u6216\u8005\u6709\u5927\u91cf\u8d85\u65f6\u60c5\u51b5\u53d1\u751f\u65f6\uff0c\u7194\u65ad\u8be5\u670d\u52a1\u7684\u8c03\u7528\uff0c\u5bf9\u4e8e\u540e\u7eed\u8c03\u7528\u8bf7\u6c42\uff0c\u4e0d\u518d\u7ee7\u7eed\u8c03\u7528\u76ee\u6807\u670d\u52a1\uff0c\u76f4\u63a5\u8fd4\u56de\uff0c\u5feb\u901f\u91ca\u653e\u8d44\u6e90\uff0c\u7b49\u5230\u8be5\u76ee\u6807\u670d\u52a1\u60c5\u51b5\u597d\u8f6c\u518d\u6062\u590d\u8c03\u7528\u3002 Bulkhead Bulkhead \u9694\u79bb\u4ed3 \u9694\u79bb\u4ed3\u662f\u4e00\u79cd\u5f02\u5e38\u68c0\u6d4b\u673a\u5236\uff0c\u5e38\u7528\u7684\u68c0\u6d4b\u65b9\u6cd5\u662f\u8bf7\u6c42\u8d85\u65f6\u3001\u6d41\u91cf\u8fc7\u5927\u7b49\u3002\u4e00\u822c\u7684\u8bbe\u7f6e\u53c2\u6570\u5305\u62ec\u8d85\u65f6\u65f6\u95f4\u3001\u6700\u5927\u5e76\u53d1\u8bf7\u6c42\u6570\u7b49\uff0c\u5f53\u8d85\u8fc7\u8d85\u65f6\u65f6\u95f4\u6216\u6700\u5927\u5e76\u53d1\u8bf7\u6c42\u6570\u65f6\uff0c\u8bb0\u5f55\u4e00\u6b21\u5f02\u5e38\uff0c\u5728\u7194\u65ad\u3001\u5b9e\u4f8b\u9694\u79bb\u673a\u5236\u4e2d\uff0c\u7528\u4e8e\u8ba1\u7b97\u9519\u8bef\u7387\u3002 Instance Isolation Instance Isolation \u5b9e\u4f8b\u9694\u79bb \u5b9e\u4f8b\u9694\u79bb\u901a\u8fc7\u68c0\u6d4b\u5b9e\u4f8b\u7684\u9519\u8bef\u7387\u3001\u8d85\u65f6\u8bf7\u6c42\u6570\u7b49\u6307\u6807\uff0c\u77ed\u6682\u7684\u5c4f\u853d\u6545\u969c\u5b9e\u4f8b\u7684\u8bbf\u95ee\uff0c\u964d\u4f4e\u9519\u8bef\u7387\u4ee5\u53ca\u9632\u6b62\u53d1\u751f\u96ea\u5d29\u6548\u5e94\u3002"},{"location":"index.html#_3","title":"\u5e2e\u52a9\u6539\u5584","text":"<ul> <li>Java Chassis\u7684 \u6587\u6863\u6e90\u4ee3\u7801 \u6258\u7ba1\u5728Github\uff0c \u53ef\u4ee5\u4e0b\u8f7d\u540e \uff0c\u91c7\u7528 MkDocs \u672c\u5730\u4f7f\u7528\u3002 \u4e5f\u53ef\u4ee5\u5728 Issues \u63d0\u4ea4\u6539\u8fdb\u5efa\u8bae\u3002 </li> </ul> <p>\u5907\u6ce8\uff1aJava Chassis 2\u548cJava Chassis 3\u7f3a\u5c11\u82f1\u6587\u7ffb\u8bd1\uff0c\u975e\u5e38\u671f\u5f85\u60a8\u7684\u5e2e\u52a9\u652f\u6301\u3002</p>"},{"location":"introduce3.x.x.html","title":"Java Chassis 3\u7248\u672c\u4ecb\u7ecd","text":"<p>\u76f8\u5bf9\u4e8eJava Chassis 2\uff0cJava Chassis 3\u5728\u4e1a\u52a1\u8fde\u7eed\u6027\u3001\u5f00\u53d1\u6613\u7528\u6027\u3001\u6027\u80fd\u53ef\u9760\u6027\u7b49\u65b9\u9762\u505a\u4e86\u5927\u91cf\u5de5\u4f5c\u3002\u4e3b\u8981\u5305\u62ec\uff1a</p> <ul> <li>\u652f\u6301 JDK 17 \u548c Spring Boot 3\u3002 Java Chassis 3\u5b8c\u5168\u4f7f\u7528JDK 17\u8fdb\u884c\u7f16\u8bd1\uff0c\u5e76\u6839\u636eJDK 17\u7684\u65b0\u7279\u6027\uff0c\u91cd\u6784\u4e86\u90e8\u5206\u4ee3\u7801\uff0c\u8c03\u6574\u4e86\u914d\u5957\u7684\u4e09\u65b9\u8f6f\u4ef6\u9009\u578b\uff0c\u4f7f\u5f97\u4ee3\u7801\u66f4\u52a0\u7b80\u6d01\uff0c\u8fd0\u884c\u66f4\u52a0\u9ad8\u6548\u3002Java Chassis 3\u5728\u5e95\u5c42\u4f9d\u8d56\u4e0a\u9762\uff0c\u5f7b\u5e95\u62e5\u62b1 Spring Boot 3\uff0c\u5e76\u4f9d\u8d56\u4e8eSpring Boot\u7279\u6027\uff0c\u91cd\u6784\u4e86\u5904\u7406\u94fe\uff08Filter\uff09\u3001\u6ce8\u518c\uff08Registration\uff09\u3001\u53d1\u73b0(Discovery)\u3001\u914d\u7f6e\uff08DynamicPropertiesSource)\u3001\u8d1f\u8f7d\u5747\u8861\uff08DiscoveryTree\u3001DiscoveryFilter)\u7b49\u6838\u5fc3\u7ec4\u4ef6\uff0c\u4ee5\u652f\u6301\u66f4\u52a0\u4e30\u5bcc\u7684\u5e94\u7528\u5f00\u53d1\u751f\u6001\uff0c\u964d\u4f4e\u6269\u5c55\u5b9e\u73b0\u7684\u96be\u5ea6\u3002</li> <li>\u652f\u6301OpenAPI 3.0.x\u3002 Java Chassis 3\u66f4\u65b0\u5347\u7ea7\u4e86OpenAPI 3.0.x\uff0c\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u63d0\u4f9b\u4e86 Content-Type \u4e3a application/protobuf\uff0c application/text\u7b49\u652f\u6301\u3002\u8fd9\u6837\u53ef\u4ee5\u5728HTTP/HTTP2\u7b49\u534f\u8bae\u57fa\u7840\u4e4b\u4e0a\uff0c\u63d0\u4f9b\u66f4\u591a\u7684\u5e8f\u5217\u5316\u534f\u8bae\u652f\u6301\uff0c\u4ee5\u63d0\u5347\u5e8f\u5217\u5316\u7684\u6027\u80fd\u3002 </li> <li>\u4f7f\u7528\u65b0\u7684\u5904\u7406\u94fe\u673a\u5236\uff08Filter\uff09\u53d6\u4ee3\u65e7\u7684\u5904\u7406\u94fe\u673a\u5236(Handler)\uff0c\u4ee5\u63d0\u4f9b\u66f4\u597d\u7684\u5f02\u6b65\u5904\u7406\u652f\u6301\u3002\u7edf\u4e00\u4e86Handler/HttServerFilter/HttpClientFilter\u7b49\u673a\u5236\uff0c\u90fd\u4f7f\u7528Filter\u6765\u8868\u8fbe\u3002 \u5c06Handler\u7684\u914d\u7f6e\u6587\u4ef6\u7f16\u6392\uff0c\u4fee\u6539\u4e3aSpring Boot\u7684\u4f9d\u8d56\u6ce8\u5165\uff0c\u7b80\u5316\u7528\u6237\u5f00\u53d1\u548c\u4f7f\u7528Filter\u3002 </li> <li>\u7b80\u5316\u4e86\u6ce8\u518c\u53d1\u73b0\uff08Discovery\u3001Registration\uff09\u63a5\u53e3\uff0c\u4f7f\u5f97\u5f00\u53d1\u8005\u80fd\u591f\u66f4\u52a0\u7b80\u5355\u7684\u9002\u914d\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6ce8\u518c\uff08Local\uff09\u3001\u5e7f\u64ad\uff08zero-config\uff09\u3001ServiceComb \u6ce8\u518c\u4e2d\u5fc3\uff08SC)\u3001Nacos\u6ce8\u518c\u4e2d\u5fc3\u7b49\u9ed8\u8ba4\u5b9e\u73b0\u3002 </li> <li>\u63d0\u4f9b\u4e86\u5168\u65b0\u7684\u5b9e\u4f8b\u7ba1\u7406\u548c\u8d1f\u8f7d\u5747\u8861\u673a\u5236\uff0c\u4ee5\u4fdd\u8bc1\u6ce8\u518c\u4e2d\u5fc3\u7f51\u7edc\u5206\u533a\u6545\u969c\u7b49\u573a\u666f\u4e0b\u7684\u53ef\u9760\u6027\u3002\u8be5\u673a\u5236\u80fd\u591f\u5728\u6ce8\u518c\u4e2d\u5fc3\u4e0d\u540c\u7684\u6545\u969c\u573a\u666f\u4e0b\u4fdd\u969c\u5fae\u670d\u52a1\u81ea\u8eab\u8fd0\u884c\u7684\u53ef\u9760\u6027\uff0c\u964d\u4f4e\u4e86\u6ce8\u518c\u4e2d\u5fc3\u53ef\u9760\u6027\u5bf9\u4e8e\u5e94\u7528\u672c\u8eab\u8fd0\u884c\u53ef\u9760\u6027\u7684\u5f71\u54cd\uff0c\u4e3a\u9009\u62e9\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u5b9e\u73b0\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u53ef\u80fd\u6027\u3002 </li> <li>\u7b80\u5316\u4e86\u914d\u7f6e\uff08DynamicPropertiesSource)\u63a5\u53e3\uff0c\u66f4\u597d\u7684\u652f\u6301Spring Boot\u7684Environment\u548cPropertySource\u7b49\u673a\u5236\u3002\u505a\u5230\u548cSpring Boot\u914d\u7f6e\u673a\u5236\u5b8c\u5168\u878d\u5408\u3002\u540c\u65f6\u4fdd\u7559\u4e86DynamicProperties\u3001PriorityPropertyManager\u7b49\u914d\u7f6e\u673a\u5236\uff0c\u5f25\u8865Spring Boot\u914d\u7f6e\u4f7f\u7528\u5728\u53d8\u66f4\u4e8b\u4ef6\u76d1\u542c\u3001\u4f18\u5148\u7ea7\u914d\u7f6e\u7b49\u65b9\u9762\u7684\u4e0d\u8db3\u3002 \u63d0\u4f9b\u4e86ServiceComb Kie\u914d\u7f6e\u4e2d\u5fc3\u3001Nacos\u914d\u7f6e\u4e2d\u5fc3\u3001Apollo\u914d\u7f6e\u4e2d\u5fc3\u7b49\u9ed8\u8ba4\u5b9e\u73b0\u3002</li> <li>\u79fb\u9664\u4e86\u5f71\u54cd\u4e1a\u52a1\u8fde\u7eed\u6027\u7684\u7ec4\u4ef6\uff0c\u5e76\u63d0\u4f9b\u4e86\u66ff\u4ee3\u65b9\u6848\u3002\u5305\u62ecHystrix\u3001Archaius\u3001Commons Configuration\u3001Ribbon\u3001Spectator\u7b49\u3002 </li> </ul>"},{"location":"build-consumer/3rd-party-service-invoke.html","title":"\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1","text":""},{"location":"build-consumer/3rd-party-service-invoke.html#_2","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u7b2c\u4e09\u65b9\u670d\u52a1\u6ca1\u6709\u5728\u670d\u52a1\u4e2d\u5fc3\u6ce8\u518c\uff0c\u4e0d\u5b58\u5951\u7ea6\u4fe1\u606f\uff0cJava Chassis \u63d0\u4f9b\u4e00\u79cd\u900f\u660e\u7684\u65b9\u5f0f\u8bbf\u95ee\u7b2c\u4e09\u65b9\u670d\u52a1\u3002 \u4f7f\u7528\u8be5\u529f\u80fd\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\u65f6\uff0c\u53d1\u5f80\u7b2c\u4e09\u65b9\u670d\u52a1\u7684\u8bf7\u6c42\u4f1a\u7ecf\u8fc7consumer\u7aefhandler\u94fe\u3001HttpClientFilter\u7684\u5904\u7406\uff0c \u5373\u8be5\u529f\u80fd\u652f\u6301\u5bf9\u7b2c\u4e09\u65b9\u670d\u52a1\u8c03\u7528\u7684\u6cbb\u7406\u529f\u80fd\uff0c\u5e76\u4e14\u4e5f\u652f\u6301ServiceComb\u65e2\u6709\u7684\u7528\u6237\u81ea\u5b9a\u4e49\u6269\u5c55\u5904\u7406\u673a\u5236\u3002 </p> <p>\u53e6\u5916\u5f00\u53d1\u8005\u4e5f\u53ef\u4ee5\u4f7f\u7528 \u672c\u5730\u6ce8\u518c\u53d1\u73b0 \u5b9e\u73b0\u7b2c\u4e09\u65b9\u8c03\u7528\uff0c \u4e24\u79cd\u65b9\u5f0f\u5b9e\u73b0\u7684\u6548\u679c\u662f\u4e00\u81f4\u7684\u3002 </p>"},{"location":"build-consumer/3rd-party-service-invoke.html#_3","title":"\u793a\u4f8b\u4ee3\u7801","text":"<ol> <li> <p>\u5047\u8bbe\u7528\u6237\u5728\u672c\u5730\u5f00\u53d1\u4e86\u4e00\u4e2aREST\u670d\u52a1\u4f5c\u4e3a\u7b2c\u4e09\u65b9REST\u670d\u52a1\uff0c\u76d1\u542c\u7aef\u53e3\u53f7\u4e3a8080\uff0c\u5176REST\u63a5\u53e3\u5982\u5951\u7ea6\u6240\u793a\uff1a</p> <pre><code>```yaml\n---\nswagger: \"2.0\"\ninfo:\nversion: \"0.0.1\"\ntitle: \"3rd party REST service for example\"\nbasePath: \"/rest\"\nconsumes:\n- \"application/json\"\nproduces:\n- \"text/plain\"\npaths:\n/{pathVar}:\n get:\n operationId: \"testPathVar\"\n parameters:\n - name: \"pathVar\"\n in: \"path\"\n required: true\n type: \"string\"\n responses:\n 200:\n description: \"response of 200, return \\\"Received, OK. [${pathVar}]\\\"\"\n schema:\n type: \"string\"\n```\n</code></pre> </li> <li> <p>\u4e3a\u8c03\u7528\u6b64\u670d\u52a1\uff0c\u9700\u8981\u5148\u6839\u636e\u5176REST\u63a5\u53e3\u7f16\u5199\u4e00\u4e2aJava\u63a5\u53e3\u7c7b\uff0c\u5e76\u6253\u4e0a\u53c2\u6570\u6ce8\u89e3\u3002 Java\u63a5\u53e3\u7c7b\u7684\u7f16\u5199\u65b9\u5f0f\u53c2\u7167\u4f7f\u7528\u9690\u5f0f\u5951\u7ea6\u5f00\u53d1SpringMVC\u548cJAX-RS\u98ce\u683c\u7684provider\u65b9\u5f0f\u3002 \u63a5\u53e3\u4ee3\u7801\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>```java\n@Path(\"/rest\")\n@Api(produces = MediaType.TEXT_PLAIN)\npublic interface VertxServerIntf {\n@Path(\"/{pathVar}\")\n@GET\nString testPathVar(@PathParam(\"pathVar\") String pathVar);\n}\n```\n</code></pre> </li> <li> <p>\u901a\u8fc7\u5b9e\u73b0 <code>ThirdServiceWithInvokerRegister</code> \u6ce8\u518c\u7b2c\u4e09\u65b9\u670d\u52a1\u4fe1\u606f\u3002 \u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a schema\u3002 </p> <pre><code>```java\n@Configuration\npublic class ThirdSvc extends ThirdServiceWithInvokerRegister {\n public ThirdSvc() {\n super(\"3rd-svc\");\n\n addSchema(\"schema-1\", VertxServerIntf.class);\n }\n}\n```\n</code></pre> <p>\u6ce8\u610f\uff1a java chassis 2.1.3 \u4ee5\u4e0a\u7248\u672c\u624d\u652f\u6301 ThirdServiceWithInvokerRegister\u3002 </p> </li> <li> <p>\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\uff0c\u58f0\u660e\u548c\u8c03\u7528\u65b9\u5f0f\u4e0e\u8c03\u7528ServiceComb provider\u670d\u52a1\u76f8\u540c\uff0c\u6b64\u5904\u4ee5RPC\u8c03\u7528\u65b9\u5f0f\u4e3a\u4f8b\u3002</p> <pre><code>```java\nVertxServerIntf client = BeanUtils.getContext().getBean(VertxServerIntf.class);\nclient.testPathVar(pathVar);\n```\n</code></pre> </li> <li> <p>\u4f7f\u7528\u6cbb\u7406\u529f\u80fd\u3002\u4f7f\u7528\u6cbb\u7406\u529f\u80fd\u7684\u65b9\u6cd5\u4e0e\u666e\u901a\u7684consumer\u8c03\u7528provider\u573a\u666f\u7c7b\u4f3c\u3002\u4ee5\u9650\u6d41\u7b56\u7565\u4e3a\u4f8b\uff0c\u5728consumer \u670d\u52a1\u7684microservice.yaml\u6587\u4ef6\u4e2d\u8fdb\u884c\u5982\u4e0b\u914d\u7f6e:</p> <pre><code>```yaml\nservicecomb:\n flowcontrol:\n Consumer:\n qps:\n enabled: true\n limit:\n thirdPartyService: 1\n```\n</code></pre> <p>\u6b64\u65f6\u5373\u5c06consumer\u8c03\u7528\u540d\u4e3a<code>thirdPartyService</code>\u7684\u7b2c\u4e09\u65b9REST\u670d\u52a1\u7684QPS\u8bbe\u7f6e\u4e3a1\u3002\u5f53consumer\u8c03\u7528<code>thirdPartyService</code>\u7684\u6d41\u91cf\u9ad8\u4e8e1QPS\u65f6\uff0c \u5c06\u4f1a\u5f97\u5230<code>429 Too Many Requests</code>\u7684<code>InvocationException</code>\u5f02\u5e38\u3002</p> </li> <li> <p>\u914d\u7f6e\u7b2c\u4e09\u5206\u670d\u52a1\u7684\u5b9e\u4f8b\u4fe1\u606f</p> <pre><code>3rd-svc:\n urls:\n - http://localhost:8080\n</code></pre> </li> </ol>"},{"location":"build-consumer/basics.html","title":"\u57fa\u7840\u6982\u5ff5","text":"<p>Java Chassis \u662f\u4ee5 OpenAPI \u4e3a\u57fa\u7840\u7684\u5fae\u670d\u52a1\u5f00\u53d1\u6846\u67b6\u3002\u4e00\u4e2a\u5fae\u670d\u52a1\u63d0\u4f9b\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u901a\u8fc7 OpenAPI \u8fdb\u884c\u63cf\u8ff0\u3002 \u5fae\u670d\u52a1\u6d88\u8d39\u8005\u548c\u63d0\u4f9b\u8005\u5b8c\u5168\u89e3\u8026\uff0c\u5f00\u53d1\u6d88\u8d39\u8005\u65e0\u9700\u77e5\u9053\u63d0\u4f9b\u8005\u7684\u5f00\u53d1\u65b9\u5f0f\uff0c\u53ea\u9700\u8981\u77e5\u9053\u63d0\u4f9b\u8005\u7684OpenAPI\u4fe1\u606f\u3002 </p> <p>\u672c\u7ae0\u8282\u4ecb\u7ecd\u57fa\u4e8e\u5f00\u53d1\u670d\u52a1\u63d0\u4f9b\u8005-\u57fa\u7840\u6982\u5ff5\u63d0\u4f9b\u7684 <code>HelloWorld</code> \u5951\u7ea6, \u63cf\u8ff0\u5982\u4f55\u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005\u3002</p> <pre><code>openapi: 3.0.1\ninfo:\n version: 1.0.0\nservers:\n- url: /\npaths:\n /helloWorld:\n post:\n operationId: helloWorld\n requestBody:\n content:\n application/json:\n schema:\n type: string\n application/protobuf:\n schema:\n type: string\n text/plain:\n schema:\n type: string\n x-name: name\n responses:\n \"200\":\n description: response of 200\n content:\n application/json:\n schema:\n type: string\n application/protobuf:\n schema:\n type: string\n text/plain:\n schema:\n type: string\ncomponents: {}\n</code></pre>"},{"location":"build-consumer/basics.html#restful-restoperations","title":"Restful\u98ce\u683c - \u4f7f\u7528 RestOperations","text":"<pre><code>RestOperations restOperation = \n RestTemplateBuilder.create();\nString result = restOperation\n .postForObject(\"servicecomb://provider-service/helloWorld\", \n \"World\", String.class);\nAssertions.assertTrue(\"Hello World\", result);\n</code></pre> <p>\u4f7f\u7528Restful\u98ce\u683c\u5f00\u53d1\u6d88\u8d39\u8005\uff0c\u9700\u8981\u5173\u6ce8Open API\u7684Path\u3001\u53c2\u6570\u4f4d\u7f6e\uff08Body\u3001Header\u7b49\uff09\u3001\u53c2\u6570\u7c7b\u578b\u4ee5\u53ca\u54cd\u5e94\u7c7b\u578b\uff0c\u5e76\u4e14\u4f7f\u7528RestOperations\u7684\u76f8\u5173\u63a5\u53e3\u548c\u53c2\u6570\u4e00\u4e00\u5bf9\u5e94\u3002 \u5176\u4e2d <code>servicecomb://provider-service</code> \u8868\u793a\u76ee\u6807\u5fae\u670d\u52a1\uff0c\u4f7f\u7528\u76ee\u6807\u5fae\u670d\u52a1\u7684\u670d\u52a1\u540d\u79f0\u3002 </p>"},{"location":"build-consumer/basics.html#rpc","title":"RPC\u98ce\u683c","text":"<p>RPC\u98ce\u683c\u662f\u4e00\u79cd\u8bed\u8a00\u6709\u5173\u7684\u5f00\u53d1\u65b9\u6cd5\uff0c\u66f4\u52a0\u8d34\u8fd1\u8bed\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\u3002\u8bbf\u95ee\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u670d\u52a1\uff0c\u5c31\u50cf\u8c03\u7528\u672c\u5730\u7684API\u4e00\u6837\u3002 </p> <p>\u4f7f\u7528RPC\u98ce\u683c\uff0c\u9996\u5148\u9700\u8981\u58f0\u660e\u4e00\u4e2a <code>interface</code> \u4e0e\u63d0\u4f9b\u8005\u7684\u670d\u52a1\u5bf9\u5e94\u3002 </p> <pre><code>interface HelloWorldService {\n String helloWorld(String name);\n}\n</code></pre> <p>\u58f0\u660e <code>interface</code> \u4f1a\u4f7f\u7528\u5230 Open API \u7684 <code>operationId</code>\u3001 \u53c2\u6570\u540d\u79f0\u548c\u53c2\u6570\u7c7b\u578b\u3001\u54cd\u5e94\u7c7b\u578b\u3002 \u53ea\u9700\u8981\u4fdd\u8bc1\u65b9\u6cd5\u540d\u7b49\u4e8e<code>operationId</code>\uff0c \u53c2\u6570\u540d\u79f0\u7b49\u4e8eOpen API\u91cc\u9762\u7684\u53c2\u6570\u540d\u79f0\uff08\u5bf9\u4e8ebody\uff0c\u4f7f\u7528\u6269\u5c55\u5c5e\u6027x-name\uff09\u3002 </p> <p>\u4f7f\u7528\u8d77\u6765\u5c31\u975e\u5e38\u7b80\u5355\u4e86\uff1a</p> <pre><code>@RpcReference(schemaId = \"HelloWorld\", \n microserviceName = \"provider-service\")\nprivate HelloWorldService helloWorldService;\n\nString result = helloWorldService.helloWorld(\"World\");\nAssertions.assertTrue(\"Hello World\", result);\n</code></pre> <p>\u5728\u5177\u4f53\u7684\u5f00\u53d1\u5b9e\u8df5\u4e2d\uff0c\u5f00\u53d1Provider\u5b9a\u4e49interface\uff08API\uff09\uff0c\u7136\u540eConsumer\u4f9d\u8d56Provider\u53d1\u5e03\u7684\u5305\uff0c\u76f4\u63a5\u4f7f\u7528Provider\u7684\u63a5\u53e3\u4e5f\u662f\u975e\u5e38\u5e38\u89c1\u7684\u3002\u5982\u679c\u5df2\u7ecf\u4e60\u60ef\u8fd9\u79cd\u4f7f\u7528\u65b9\u5f0f\uff0c\u53ef\u4ee5\u7ee7\u7eed\u4f7f\u7528\u3002 \u5728\u8ba8\u8bba\u5b8c\u5168\u89e3\u8026\u548cAPI\u4f9d\u8d56\u7684\u597d\u5904\u7684\u65f6\u5019\uff0c\u5b58\u5728\u975e\u5e38\u590d\u6742\u548c\u7ec6\u8282\u7684\u5dee\u5f02\u3002\u5b8c\u5168\u89e3\u8026\u7684\u5f62\u5f0f\uff0c\u53ef\u4ee5\u7ed9\u72ec\u7acb\u5f00\u53d1\u5e26\u6765\u5f88\u5927\u7684\u7075\u6d3b\u6027\uff0c\u80fd\u591f\u63d0\u9ad8\u5e76\u884c\u5f00\u53d1\u7684\u6548\u7387\u3002 </p>"},{"location":"build-consumer/basics.html#-invokerutils","title":"\u6cdb\u5316\u8c03\u7528 - InvokerUtils","text":"<pre><code>Map&lt;String, Object&gt; args = new HashMap&lt;&gt;();\nargs.put(\"name\", \"World\");\nString result = InvokerUtils.syncInvoke(\"provider-service\",\n \"HelloWorld\", \"helloWorld\", args, String.class));\nAssertions.assertTrue(\"Hello World\", result);\n</code></pre> <p>\u6cdb\u5316\u8c03\u7528\u4f7f\u7528\u670d\u52a1\u540d\u3001\u5951\u7ea6\u540d\u79f0\u3001<code>operationId</code>\u3001 \u53c2\u6570\u76f4\u63a5\u8bf7\u6c42\u670d\u52a1\u63d0\u4f9b\u8005\uff0c\u5bf9\u5e94\u5230 Open API \u7684<code>operationId</code>\u3001\u53c2\u6570\u540d\u79f0\u548c\u53c2\u6570\u7c7b\u578b\u3001\u54cd\u5e94\u7c7b\u578b\u3002</p>"},{"location":"build-consumer/code-first.html","title":"Code first","text":""},{"location":"build-consumer/code-first.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u670d\u52a1\u6d88\u8d39\u8005\u53ef\u4ee5\u4e0d\u7528\u663e\u5f0f\u5730\u5c06\u5951\u7ea6\u5b58\u653e\u5728\u9879\u76ee\u76ee\u5f55\u4e2d\uff0c\u5f53\u7a0b\u5e8f\u542f\u52a8\u65f6\uff0cServiceComb\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636emicroservice.yaml\u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u5fae\u670d\u52a1\u540d\u79f0\u548c\u7248\u672c\u53f7\uff0c\u4ece\u670d\u52a1\u4e2d\u5fc3\u62c9\u53d6\u5951\u7ea6\u4fe1\u606f\u3002</p>"},{"location":"build-consumer/code-first.html#api","title":"\u6d89\u53caAPI","text":"<p>\u4f7f\u7528\u9690\u5f0f\u5951\u7ea6\u53ef\u7528\u4e8eRestTemplate\u3001\u900f\u660eRPC\u4e24\u79cd\u670d\u52a1\u6d88\u8d39\u8005\u5f00\u53d1\u6a21\u5f0f\uff0c\u4f7f\u7528RestTemplate\u7684\u5f00\u53d1\u65b9\u5f0f\u53c2\u89c14.3 \u4f7f\u7528RestTemplate\u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005\u3002</p>"},{"location":"build-consumer/code-first.html#_2","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>\u672c\u5c0f\u8282\u4ee5\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u4e3a\u4f8b\u5c55\u793a\u5982\u4f55\u4f7f\u7528\u9690\u5f0f\u5951\u7ea6\u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005\u3002</p> <p>\u670d\u52a1\u6d88\u8d39\u8005\u7684\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>import org.springframework.stereotype.Component;\nimport org.apache.servicecomb.foundation.common.utils.BeanUtils;\nimport org.apache.servicecomb.foundation.common.utils.Log4jUtils;\nimport org.apache.servicecomb.provider.pojo.RpcReference;\nimport org.apache.servicecomb.samples.common.schema.Hello;\nimport org.apache.servicecomb.samples.common.schema.models.Person;\n\n@Component\npublic class CodeFirstConsumerMain {\n @RpcReference(microserviceName = \"codefirst\", schemaId = \"codeFirstHello\")\n private static Hello hello;\n\n public static void main(String[] args) throws Exception {\n init();\n System.out.println(hello.sayHi(\"Java Chassis\"));\n Person person = new Person();\n person.setName(\"ServiceComb/Java Chassis\");\n System.out.println(hello.sayHello(person));\n }\n\n public static void init() throws Exception {\n Log4jUtils.init();\n BeanUtils.init();\n }\n}\n</code></pre> <p>\u5728\u4ee5\u4e0a\u4ee3\u7801\u4e2d\uff0c\u670d\u52a1\u6d88\u8d39\u8005\u5df2\u7ecf\u53d6\u5f97\u4e86\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u670d\u52a1\u63a5\u53e3Hello\uff0c\u5e76\u5728\u4ee3\u7801\u4e2d\u58f0\u660e\u4e00\u4e2aHello\u7c7b\u578b\u7684\u6210\u5458\u3002\u901a\u8fc7\u5728hello\u4e0a\u4f7f\u7528RPCReference\u6ce8\u89e3\u6307\u660e\u5fae\u670d\u52a1\u540d\u79f0\u548cschemaId\uff0cServiceComb\u6846\u67b6\u53ef\u4ee5\u5728\u7a0b\u5e8f\u542f\u52a8\u65f6\u4ece\u670d\u52a1\u4e2d\u5fc3\u83b7\u53d6\u5230\u5bf9\u5e94\u7684\u670d\u52a1\u63d0\u4f9b\u8005\u5b9e\u4f8b\u4fe1\u606f\uff0c\u5e76\u4e14\u751f\u6210\u4e00\u4e2a\u4ee3\u7406\u6ce8\u5165\u5230hello\u4e2d\uff0c\u7528\u6237\u53ef\u4ee5\u50cf\u8c03\u7528\u672c\u5730\u7c7b\u4e00\u6837\u8c03\u7528\u8fdc\u7a0b\u670d\u52a1\u3002</p>"},{"location":"build-consumer/develop-consumer-using-rpc.html","title":"\u4f7f\u7528RPC\u65b9\u5f0f\u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005","text":""},{"location":"build-consumer/develop-consumer-using-rpc.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u5141\u8bb8\u7528\u6237\u901a\u8fc7\u7b80\u5355\u7684java interface\u50cf\u672c\u5730\u8c03\u7528\u4e00\u6837\u8fdb\u884c\u670d\u52a1\u8c03\u7528\u3002 \u900f\u660eRPC\u4ec5\u4ec5\u662f\u4e00\u79cd\u5f00\u53d1\u6a21\u5f0f\uff1a</p> <ul> <li>\u4e0e\u4f7f\u7528highway\u8fd8\u662fRESTful\u4f20\u8f93\u6ca1\u6709\u5173\u8054</li> <li>\u4e0eproducer\u4f7f\u7528\u900f\u660eRPC/Jax-RS\u8fd8\u662fSpringMVC\u6a21\u5f0f\u5f00\u53d1\u6ca1\u6709\u5173\u8054</li> <li>\u4e5f\u4e0eproducer\u4ee3\u7801\u662f\u5426\u5b9e\u73b0\u8fd9\u4e2ainterface\u6ca1\u6709\u5173\u8054\u3002 </li> </ul> <p>\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u4e0espring boot\u7684feign\u7c7b\u4f3c\uff0c\u4e0d\u8fc7\u66f4\u7b80\u5355\uff0c\u56e0\u4e3a\u4e0d\u5fc5\u5728\u8fd9\u4e2ainterface\u4e2d\u589e\u52a0\u4efb\u4f55RESTful annotation\u3002</p>"},{"location":"build-consumer/develop-consumer-using-rpc.html#spring-beanrpcreference","title":"\u5728spring bean\u4e2d\u901a\u8fc7@RpcReference\u58f0\u660e","text":"<pre><code>@Component\npublic class SomeBean {\n ......\n\n @RpcReference(microserviceName = \"helloService\", schemaId = \"helloSchema\")\n private Hello hello;\n\n ......\n}\n</code></pre>"},{"location":"build-consumer/develop-consumer-using-rpc.html#spring-beanapi","title":"\u8131\u79bbspring bean\uff0c\u76f4\u63a5\u901a\u8fc7api\u58f0\u660e","text":"<pre><code>Hello hello = Invoker.createProxy(\"helloService\", \"helloSchema\", Hello.class);\n</code></pre>"},{"location":"build-consumer/develop-consumer-using-rpc.html#reactive","title":"reactive","text":"<p>\u53ea\u9700\u8981\u4f7f\u7528jdk\u7684CompletableFuture\u5bf9\u8fd4\u56de\u503c\u8fdb\u884c\u5305\u88c5\u5373\u53ef</p> <pre><code>interface Hello {\n CompletableFuture&lt;String&gt; sayHi(String name);\n}\n</code></pre> <p>\u540c\u4e00\u4e2ainterface\u4e2d\uff0c\u53ef\u4ee5\u540c\u65f6\u58f0\u660e\u540c\u4e00\u4e2a\u65b9\u6cd5\u7684reactive\u548c\u540c\u6b65\u539f\u578b \u56e0\u4e3a\u8981\u6c42\u65b9\u6cd5\u540d\u4e0e\u5951\u7ea6\u4e2d\u7684operationId\u4e00\u4e00\u5bf9\u5e94\uff0c\u800c\u4ec5\u6709\u8fd4\u56de\u503c\u7c7b\u578b\u4e0d\u540c\uff0c\u5728java\u4e2d\u662f\u975e\u6cd5\u7684\uff0c\u6240\u4ee5\u9700\u8981\u4fee\u6539\u65b9\u6cd5\u540d\uff0c\u5e76\u901a\u8fc7swagger annotation\u6765\u58f0\u660e\u771f\u6b63\u7684operationId</p> <pre><code>interface Hello {\n String sayHi(String name);\n\n @ApiOperation(nickname = \"sayHi\", value = \"reactive method for sayHi\")\n CompletableFuture&lt;String&gt; asyncSayHi(String name);\n}\n</code></pre>"},{"location":"build-consumer/invoker.html","title":"\u6cdb\u5316\u8c03\u7528","text":"<p>\u6cdb\u5316\u8c03\u7528\u6307\u5728\u4e0d\u77e5\u9053 Provider \u63a5\u53e3\u5b9a\u4e49\u4fe1\u606f\u7684\u60c5\u51b5\u4e0b\uff0c\u8bbf\u95ee Provider \u63d0\u4f9b\u7684\u670d\u52a1\u3002 \u6cdb\u5316 \u8c03\u7528\u9700\u8981\u63d0\u4f9b Provider \u7684\u670d\u52a1\u5143\u6570\u636e\uff1a \u5fae\u670d\u52a1\u540d\u79f0\uff0c \u7248\u672c\uff0c Schema ID\uff0c Operation ID, \u5951\u7ea6\u53c2\u6570\u7b49\u4fe1\u606f\u3002 </p>"},{"location":"build-consumer/invoker.html#_2","title":"\u4f7f\u7528\u6cdb\u5316\u8c03\u7528","text":"<p>\u5047\u8bbe Provider \u91c7\u7528\u900f\u660e RPC \u7684\u65b9\u5f0f\u63d0\u4f9b\u4e86\u5982\u4e0b\u670d\u52a1\uff1a</p> <pre><code>@RpcSchema(schemaId = \"InvokerEndpoint\")\npublic class InvokerEndpoint {\n public ServerModel model(ServerModel request) {\n return request;\n }\n}\n\npublic class ServerModel {\n private String name;\n private int code;\n\n public String getName() {\n return name;\n }\n\n public void setName(String name) {\n this.name = name;\n }\n\n public int getCode() {\n return code;\n }\n\n public void setCode(int code) {\n this.code = code;\n }\n}\n</code></pre> <p>\u53ef\u4ee5\u91c7\u7528 InvokerUtils \u8bbf\u95ee\u8fd9\u4e2a\u670d\u52a1\uff1a</p> <pre><code>Map&lt;String, Object&gt; args = new HashMap&lt;&gt;();\nClientModel model = new ClientModel();\nmodel.setCode(200);\nmodel.setName(\"hello\");\nargs.put(\"request\", model);\n\nClientModel modelResult = InvokerUtils.syncInvoke(\"pojo\", \"InvokerEndpoint\", \"model\", args, ClientModel.class);\nTestMgr.check(model.getCode(), modelResult.getCode());\nTestMgr.check(model.getName(), modelResult.getName());\n\npublic class ClientModel {\n private String name;\n private int code;\n\n public String getName() {\n return name;\n }\n\n public void setName(String name) {\n this.name = name;\n }\n\n public int getCode() {\n return code;\n }\n\n public void setCode(int code) {\n this.code = code;\n }\n}\n</code></pre> <p>\u53ef\u4ee5\u770b\u51fa\uff0c\u5728\u6cdb\u5316\u8c03\u7528\u7684\u60c5\u51b5\u4e0b\uff0c Provider \u548c Consumer \u53ef\u4ee5\u4f7f\u7528\u4e0d\u4e00\u6837 package \u7684 Model\u3002 Consumer \u8fd8\u53ef\u4ee5\u4e0d\u4f7f\u7528\u4efb\u4f55 Model, \u800c\u91c7\u7528 Map \u7684\u65b9\u5f0f\u8bbf\u95ee\uff1a</p> <pre><code>Map&lt;String, Object&gt; args = new HashMap&lt;&gt;();\nMap model = new HashMap();\nmodel.put(\"code\", 20);\nmodel.put(\"name\", \"hello\");\nargs.put(\"request\", model);\n\nClientModel modelResult = InvokerUtils.syncInvoke(\"pojo\", \"InvokerEndpoint\", \"model\", args, ClientModel.class);\nTestMgr.check(model.get(\"code\"), modelResult.getCode());\nTestMgr.check(model.get(\"name\"), modelResult.getName());\n</code></pre> <p>\u9700\u8981\u7279\u522b\u8bf4\u660e\u7684\u662f\u53c2\u6570 <code>swaggerArguments</code> \uff0c \u8fd9\u4e2a\u53c2\u6570\u662f\u548c Provider \u63a5\u53e3\u751f\u6210\u7684\u5951\u7ea6\u5bf9\u5e94\u7684\uff0c \u4e0d\u5173\u6ce8 Provider \u662f\u91c7\u7528\u900f\u660e RPC\uff0c \u8fd8\u662f \u91c7\u7528 Spring MVC \uff0c \u6216\u8005 JAX RS \u5f00\u53d1\u7684\u670d\u52a1\u3002 \u9700\u8981\u6ce8\u610f <code>swaggerArguments</code> \u53ef\u80fd\u548c Provider \u7684\u63a5\u53e3\u5b9a\u4e49\u7684\u53c2\u6570\u5217\u8868\u4e0d\u4e00\u6837\uff0c\u6bd4\u5982\u900f\u660e RPC \u5f00\u53d1\u6a21\u5f0f\u4e0b\u591a\u4e2a\u53c2\u6570\u7684\u573a\u666f\uff0c Spring MVC \u7684 Bean Param \u7684\u573a\u666f\u7b49\u7b49\u3002 </p>"},{"location":"build-consumer/invoker.html#reactive-api","title":"\u91c7\u7528 reactive API","text":"<pre><code>CountDownLatch countDownLatch = new CountDownLatch(1);\nInvokerUtils.reactiveInvoke(\"pojo\", \"InvokerEndpoint\", \"model\", args, ClientModel.class, response -&gt; {\n ClientModel reactiveResult = response.getResult();\n TestMgr.check(model.getCode(), reactiveResult.getCode());\n TestMgr.check(model.getName(), reactiveResult.getName());\n countDownLatch.countDown();\n});\ncountDownLatch.await();\n</code></pre>"},{"location":"build-consumer/using-resttemplate.html","title":"Restful\u98ce\u683c - \u4f7f\u7528 RestOperations","text":""},{"location":"build-consumer/using-resttemplate.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>RestOperations\u662fSpring\u63d0\u4f9b\u7684RESTful\u8bbf\u95ee\u63a5\u53e3\uff0cServiceComb\u63d0\u4f9b\u8be5\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u7528\u4e8e\u670d\u52a1\u7684\u8c03\u7528\u3002</p>"},{"location":"build-consumer/using-resttemplate.html#_2","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7528\u6237\u4f7f\u7528ServiceComb\u63d0\u4f9b\u7684RestOperations\u5b9e\u4f8b\uff0c\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684URL\u8fdb\u884c\u670d\u52a1\u8c03\u7528\uff0c\u800c\u4e0d\u7528\u5173\u5fc3\u670d\u52a1\u7684\u5177\u4f53\u5730\u5740\u3002</p>"},{"location":"build-consumer/using-resttemplate.html#_3","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>RestOperations\u5b9e\u4f8b\u901a\u8fc7\u8c03\u7528<code>RestTemplateBuilder.create()</code>\u65b9\u6cd5\u83b7\u53d6\uff0c\u518d\u4f7f\u7528\u8be5\u5b9e\u4f8b\u901a\u8fc7\u81ea\u5b9a\u4e49\u7684URL\u8fdb\u884c\u670d\u52a1\u8c03\u7528\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a</p> <ul> <li>Spring MVC \u5ba2\u6237\u7aef\u793a\u4f8b\u4ee3\u7801\uff1a</li> </ul> <pre><code>public class SpringmvcConsumerExample {\n private static RestOperations restTemplate = RestTemplateBuilder.create();\n\n public static void test() throws Exception {\n Person person = new Person();\n person.setName(\"ServiceComb/Java Chassis\");\n String sayHiResult = restTemplate\n .postForObject(\"servicecomb://springmvc/springmvchello/sayhi?name=Java Chassis\", null, String.class);\n String sayHelloResult = restTemplate\n .postForObject(\"servicecomb://springmvc/springmvchello/sayhello\", person, String.class);\n System.out.println(\"RestTemplate consumer sayhi services: \" + sayHiResult);\n System.out.println(\"RestTemplate consumer sayhello services: \" + sayHelloResult);\n }\n}\n</code></pre> <ul> <li>JAX RS \u5ba2\u6237\u7aef\u793a\u4f8b\u4ee3\u7801\uff1a</li> </ul> <pre><code>public class JaxrsConsumerMain {\n public static void test() throws Exception {\n //\u5176\u4ed6\u90fd\u7c7b\u4f3cspring MVC\u793a\u4f8b\u7684\u5ba2\u6237\u7aef\u4ee3\u7801\uff0c\u6ce8\u610f\u5982\u679c\u670d\u52a1\u7aef\u53ea\u63a5\u6536 GET \u8bf7\u6c42\uff0c\u8981\u4f7f\u7528\u65b9\u6cd5 getForObject()\n RestTemplate restTemplate = RestTemplateBuilder.create();\n String result = restTemplate.getForObject(\"servicecomb://jaxrs/jaxrshello/saybye\", String.class);\n }\n}\n</code></pre> <p>\u8bf4\u660e\uff1a</p> <ul> <li>URL\u683c\u5f0f\u4e3a\uff1a<code>servicecomb://microserviceName/path?querystring</code>\u3002\u4ee5\u7528SpringMVC\u5f00\u53d1\u5fae\u670d\u52a1\u4e2d\u5b9a\u4e49\u7684\u670d\u52a1\u63d0\u4f9b\u8005\u4e3a\u4f8b\uff0c\u5176\u5fae\u670d\u52a1\u540d\u79f0\u662f<code>springmvc</code>\uff0cbasePath\u662f<code>/springmvchello</code>\uff0c\u90a3\u4e48URL\u4e2d\u7684microserviceName=<code>springmvc</code>\uff0c\u8bf7\u6c42sayhi\u65f6\u7684path=<code>springmvchello/sayhi</code>\uff0c\u6240\u4ee5\u793a\u4f8b\u4ee3\u7801\u4e2d\u8bf7\u6c42sayhi\u7684URL\u662f<code>servicecomb://springmvc/springmvchello/sayhi?name=Java Chassis</code>\u3002\u5177\u4f53\u4ee3\u7801\u793a\u4f8b\u5982\u4e0b \uff1a</li> </ul> <pre><code>@RestSchema(schemaId = \"springmvcHello\")\n@RequestMapping(path = \"/springmvchello\", produces = MediaType.APPLICATION_JSON)\n//\u8fd9\u91cc path = \u201c/springmvchello\u201d \u4e2d\u7684 springmvchello \u5c31\u662f \u4e0a\u8ff0\u7684basePath\npublic class SpringmvcHelloImpl implements Hello {\n @Override\n @RequestMapping(path = \"/sayhi\", method = RequestMethod.POST)\n public String sayHi(@RequestParam(name = \"name\") String name) {\n return \"Hello \" + name;\n }\n\n @Override\n @RequestMapping(path = \"/sayhello\", method = RequestMethod.POST)\n public String sayHello(@RequestBody Person person) {\n return \"Hello person \" + person.getName();\n }\n}\n</code></pre>"},{"location":"build-provider/access-log-configuration.html","title":"Access Log","text":""},{"location":"build-provider/access-log-configuration.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>ServiceComb \u63d0\u4f9b\u4e86\u57fa\u4e8e Vert.x \u7684 access log \u548c request log \u529f\u80fd\u3002\u5f53\u7528\u6237\u4f7f\u7528 REST over Vertx \u901a\u4fe1\u65b9\u5f0f\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u7b80\u5355\u7684\u914d\u7f6e\u542f\u7528 access log \u6253\u5370\u529f\u80fd\u3002\u5f53\u7528\u6237 client \u7aef\u8fdb\u884c\u8fdc\u7a0b\u8c03\u7528\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u7b80\u5355\u7684\u914d\u7f6e\u542f\u7528 request log \u6253\u5370\u529f\u80fd</p>"},{"location":"build-provider/access-log-configuration.html#_2","title":"\u573a\u666f\u63cf\u8ff0","text":"<ol> <li> <p>\u7528\u6237\u5728\u8c03\u8bd5\u670d\u52a1\u65f6\u53ef\u80fd\u9700\u8981\u5f00\u542f access log\u3002\u5728\u4f7f\u7528 REST over servlet \u901a\u4fe1\u65b9\u5f0f\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528 web\u5bb9\u5668 \u7684 access log \u529f\u80fd\uff1b\u800c\u5728\u4f7f\u7528 REST over Vertx \u901a\u4fe1\u65b9\u5f0f\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528 ServiceComb \u63d0\u4f9b\u7684\u4e00\u5957 access log \u529f\u80fd\u3002</p> </li> <li> <p>\u7528\u6237\u60f3\u8981\u8ddf\u8e2a\uff0c\u8bb0\u5f55\u5ba2\u6237\u7aef\u8fdc\u7a0b\u8c03\u7528\u4fe1\u606f\uff0c \u53ef\u4ee5\u5f00\u542f request log\u3002request log \u540c\u65f6\u652f\u6301\u8bb0\u5f55 rest \u548c highway \u8fdc\u7a0b\u8c03\u7528\u65b9\u5f0f\u3002</p> </li> </ol>"},{"location":"build-provider/access-log-configuration.html#_3","title":"\u914d\u7f6e\u8bf4\u660e","text":""},{"location":"build-provider/access-log-configuration.html#access-log-request-log","title":"\u542f\u7528 Access Log &amp; Request Log","text":"<p>\u7528\u6237\u9700\u8981\u5728 microservice.yaml \u6587\u4ef6\u4e2d\u589e\u52a0\u914d\u7f6e\u4ee5\u542f\u7528 access log \u548c request log\uff0c\u914d\u7f6e\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n accesslog:\n ## server \u7aef \u542f\u7528access log\n enabled: true\n ## server \u7aef \u81ea\u5b9a\u4e49 access log \u65e5\u5fd7\u683c\u5f0f\n pattern: \"%h - - %t %r %s %B %D\" \n request:\n ## client \u7aef\u5f00\u542f request log\n enabled: true\n ## client \u7aef\u81ea\u5b9a\u4e49 request log \u65e5\u5fd7\u683c\u5f0f\n pattern: \"%h %SCB-transport - - %t %r %s %D\" \n</code></pre> <p>Access log &amp; Request log \u914d\u7f6e\u9879\u8bf4\u660e</p> \u914d\u7f6e\u9879 \u53d6\u503c\u8303\u56f4 \u9ed8\u8ba4\u503c \u8bf4\u660e servicecomb.accesslog.enabled true/false false \u5982\u679c\u4e3atrue\u5219\u542f\u7528access log\uff0c\u5426\u5219\u4e0d\u542f\u7528 servicecomb.accesslog.pattern \u8868\u793a\u6253\u5370\u683c\u5f0f\u7684\u5b57\u7b26\u4e32 \"%h - - %t %r %s %B %D\" \u914d\u7f6e\u9879\u89c1_\u65e5\u5fd7\u5143\u7d20\u8bf4\u660e\u8868_ servicecomb.accesslog.request.enabled true/false false \u5982\u679c\u4e3atrue\u5219\u542f\u7528request log\uff0c\u5426\u5219\u4e0d\u542f\u7528 servicecomb.accesslog.request.pattern \u8868\u793a\u6253\u5370\u683c\u5f0f\u7684\u5b57\u7b26\u4e32 \"%h %SCB-transport - - %t %r %s %D\" \u914d\u7f6e\u9879\u89c1_\u65e5\u5fd7\u5143\u7d20\u8bf4\u660e\u8868_"},{"location":"build-provider/access-log-configuration.html#_4","title":"\u65e5\u5fd7\u683c\u5f0f\u914d\u7f6e","text":"<p>\u76ee\u524d\u53ef\u7528\u7684\u65e5\u5fd7\u5143\u7d20\u914d\u7f6e\u9879\u89c1 \u65e5\u5fd7\u5143\u7d20\u8bf4\u660e\u8868(Apache &amp; W3C) \u548c \u65e5\u5fd7\u5143\u7d20\u8bf4\u660e\u8868(ServiceComb) \u3002</p> <p>\u65e5\u5fd7\u5143\u7d20\u8bf4\u660e\u8868 (Apache &amp; W3C)</p> \u5143\u7d20\u540d\u79f0 Apache\u65e5\u5fd7\u683c\u5f0f W3C\u65e5\u5fd7\u683c\u5f0f \u8bf4\u660e HTTP method %m cs-method - HTTP status %s sc-status - Duration in second %T - - Duration in millisecond %D - - Remote hostname %h - - Local hostname %v - - Local port %p - - Size of response %B - \u5982\u679c\u6d88\u606f\u4f53\u957f\u5ea6\u4e3a\u96f6\u5219\u6253\u5370\"0\" Size of response %b - \u5982\u679c\u6d88\u606f\u4f53\u957f\u5ea6\u4e3a\u96f6\u5219\u6253\u5370\"-\" First line of request %r - \u5305\u542bHTTP Method\u3001Uri\u3001Http\u7248\u672c\u4e09\u90e8\u5206\u5185\u5bb9 URI path %U cs-uri-stem - Query string %q cs-uri-query - URI path and query string - cs-uri - Request protocol %H - - Datetime the request is received %t - \u6309\u7167\u9ed8\u8ba4\u8bbe\u7f6e\u6253\u5370\u65f6\u95f4\u6233\uff0c\u683c\u5f0f\u4e3a\"EEE, dd MMM yyyy HH:mm:ss zzz\"\uff0c\u8bed\u8a00\u4e3a\u82f1\u6587\uff0c\u65f6\u533a\u4e3aGMT Configurable datetime the request is received %{PATTERN}t - \u6309\u7167\u6307\u5b9a\u7684\u683c\u5f0f\u6253\u5370\u65f6\u95f4\u6233\uff0c\u8bed\u8a00\u4e3a\u82f1\u6587\uff0c\u65f6\u533a\u4e3aGMT Configurable datetime the request is received %{PATTERN|TIMEZONE|LOCALE}t - \u6309\u7167\u6307\u5b9a\u7684\u683c\u5f0f\u3001\u8bed\u8a00\u3001\u65f6\u533a\u6253\u5370\u65f6\u95f4\u6233\u3002\u5141\u8bb8\u7701\u7565\u5176\u4e2d\u7684\u67d0\u90e8\u5206\u914d\u7f6e\uff08\u4f46\u4e24\u4e2a\u5206\u9694\u7b26\u53f7\"|\"\u4e0d\u53ef\u7701\u7565\uff09\u3002 Request header %{VARNAME}i - \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684header\uff0c\u5219\u6253\u5370\"-\" Response header %{VARNAME}o - \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684header\uff0c\u5219\u6253\u5370\"-\" Cookie %{VARNAME}C - \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684cookie\uff0c\u5219\u6253\u5370\"-\" <p>\u65e5\u5fd7\u5143\u7d20\u8bf4\u660e\u8868(ServiceComb)</p> Element Placeholder Comment TraceId %SCB-traceId \u6253\u5370ServiceComb\u751f\u6210\u7684trace id\uff0c\u627e\u4e0d\u5230\u5219\u6253\u5370\"-\" Invocation Context %{VARNAME}SCB-ctx \u6253\u5370key\u4e3a<code>VARNAME</code>\u7684invocation context\u503c\uff0c\u627e\u4e0d\u5230\u5219\u6253\u5370\"-\" Transport Method %SCB-transport \u6253\u5370\u5f53\u524d\u8c03\u7528\u7684 transport method \u3002 <code>rest</code> \u6216\u8005 <code>highway</code> <p>Access log \u4e0e Request log \u7684\u65e5\u5fd7\u5143\u7d20\u5bf9\u6bd4</p> \u5143\u7d20\u540d\u79f0 Apache&amp;W3C\u65e5\u5fd7\u683c\u5f0f access log access log \u8bf4\u660e request log request log\u8bf4\u660e HTTP method %m &amp; cs-method support - support - HTTP status %s &amp; sc-status support - support - Duration in second %T support - support - Duration in millisecond %D support - support - Remote hostname %h support - support - Local hostname %v support - support - Local port %p support - support - Size of response %B support \u5982\u679c\u6d88\u606f\u4f53\u957f\u5ea6\u4e3a\u96f6\u5219\u6253\u5370\"0\" unsupported - Size of response %b support \u5982\u679c\u6d88\u606f\u4f53\u957f\u5ea6\u4e3a\u96f6\u5219\u6253\u5370\"-\" unsupported - First line of request %r support \u5305\u542bHTTP Method\u3001Uri\u3001Http\u7248\u672c\u4e09\u90e8\u5206\u5185\u5bb9 support \u5305\u542bHTTP Method\u3001Uri\u3001Http\u7248\u672c\u4e09\u90e8\u5206\u5185\u5bb9 URI path %U &amp; cs-uri-stem support - support - Query string %q &amp; cs-uri-query support - support - URI path and query string cs-uri support - support - Request protocol %H support - support - Datetime of the request %t support \u6536\u5230\u8bf7\u6c42\u7684\u65f6\u95f4\u3002\u9ed8\u8ba4\u683c\u5f0f\u4e3a\"EEE, dd MMM yyyy HH:mm:ss zzz\"\uff0c\u8bed\u8a00\u4e3a\u82f1\u6587\uff0c\u65f6\u533a\u4e3aGMT support \u53d1\u9001\u8bf7\u6c42\u7684\u65f6\u95f4\u3002\u9ed8\u8ba4\u683c\u5f0f\u4e3a\"EEE, dd MMM yyyy HH:mm:ss zzz\"\uff0c\u8bed\u8a00\u4e3a\u82f1\u6587\uff0c\u65f6\u533a\u4e3aGMT Configurable datetime the request of the request %{PATTERN}t support \u6536\u5230\u8bf7\u6c42\u7684\u65f6\u95f4\u3002\u6309\u7167\u6307\u5b9a\u7684\u683c\u5f0f\u6253\u5370\u65f6\u95f4\u6233\uff0c\u8bed\u8a00\u4e3a\u82f1\u6587\uff0c\u65f6\u533a\u4e3aGMT support \u53d1\u9001\u8bf7\u6c42\u7684\u65f6\u95f4\u3002\u6309\u7167\u6307\u5b9a\u7684\u683c\u5f0f\u6253\u5370\u65f6\u95f4\u6233\uff0c\u8bed\u8a00\u4e3a\u82f1\u6587\uff0c\u65f6\u533a\u4e3aGMT Configurable datetime the request of the request %{PATTERN|TIMEZONE|LOCALE}t support \u6536\u5230\u8bf7\u6c42\u7684\u65f6\u95f4\u3002\u6309\u7167\u6307\u5b9a\u7684\u683c\u5f0f\u3001\u8bed\u8a00\u3001\u65f6\u533a\u6253\u5370\u65f6\u95f4\u6233\u3002\u5141\u8bb8\u7701\u7565\u5176\u4e2d\u7684\u67d0\u90e8\u5206\u914d\u7f6e\uff08\u4f46\u4e24\u4e2a\u5206\u9694\u7b26\u53f7\"|\"\u4e0d\u53ef\u7701\u7565\uff09\u3002 support \u53d1\u9001\u8bf7\u6c42\u7684\u65f6\u95f4\u3002\u6309\u7167\u6307\u5b9a\u7684\u683c\u5f0f\u3001\u8bed\u8a00\u3001\u65f6\u533a\u6253\u5370\u65f6\u95f4\u6233\u3002\u5141\u8bb8\u7701\u7565\u5176\u4e2d\u7684\u67d0\u90e8\u5206\u914d\u7f6e\uff08\u4f46\u4e24\u4e2a\u5206\u9694\u7b26\u53f7\"|\"\u4e0d\u53ef\u7701\u7565\uff09\u3002 Request header %{VARNAME}i support \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684header\uff0c\u5219\u6253\u5370\"-\" support \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684header\uff0c\u5219\u6253\u5370\"-\" Response header %{VARNAME}o support \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684header\uff0c\u5219\u6253\u5370\"-\" support \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684header\uff0c\u5219\u6253\u5370\"-\" Cookie %{VARNAME}C support \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684cookie\uff0c\u5219\u6253\u5370\"-\" support \u5982\u679c\u6ca1\u6709\u627e\u5230\u6307\u5b9a\u7684cookie\uff0c\u5219\u6253\u5370\"-\" TraceId %SCB-traceId support \u6253\u5370ServiceComb\u751f\u6210\u7684trace id\uff0c\u627e\u4e0d\u5230\u5219\u6253\u5370\"-\" support \u6253\u5370ServiceComb\u751f\u6210\u7684trace id\uff0c\u627e\u4e0d\u5230\u5219\u6253\u5370\"-\" Invocation Context %{VARNAME}SCB-ctx support \u6253\u5370key\u4e3a<code>VARNAME</code>\u7684invocation context\u503c\uff0c\u627e\u4e0d\u5230\u5219\u6253\u5370\"-\" support \u6253\u5370key\u4e3a<code>VARNAME</code>\u7684invocation context\u503c\uff0c\u627e\u4e0d\u5230\u5219\u6253\u5370\"-\" transport method %SCB-transport unsupported \u53ea\u652f\u6301 rest \u5f62\u5f0f\u8c03\u7528 support \u8c03\u7528\u4f7f\u7528\u7684transport method"},{"location":"build-provider/access-log-configuration.html#_5","title":"\u65e5\u5fd7\u8f93\u51fa\u6587\u4ef6\u914d\u7f6e","text":"<p>Access log &amp; Request log \u7684\u65e5\u5fd7\u6253\u5370\u5b9e\u73b0\u6846\u67b6\u9ed8\u8ba4\u91c7\u7528 Slf4j \uff0c\u5176\u4e2d logger \u540d\u79f0\u5206\u522b\u4e3a <code>accesslog</code> \u548c <code>requestlog</code>, \u53ef\u4ee5\u7ed3\u5408\u5e94\u7528\u4f7f\u7528\u7684\u65e5\u5fd7\u6846\u67b6\u5c06\u65e5\u5fd7\u8f93\u51fa\u5230\u4e0d\u540c\u7684\u6587\u4ef6\u4e2d\u3002</p>"},{"location":"build-provider/access-log-configuration.html#access-log-request-log_1","title":"\u81ea\u5b9a\u4e49\u6269\u5c55 Access Log &amp; Request Log","text":"<p>\u7528\u6237\u53ef\u4ee5\u5229\u7528 ServiceComb \u63d0\u4f9b\u7684 AccessLogItem \u6269\u5c55\u673a\u5236\uff0c\u5b9a\u5236\u81ea\u5df1\u7684 AccessLogItem\uff0c \u6211\u4eec\u628a Request Log \u4e5f\u5f53\u505a\u4e00\u79cd Access Log\u3002</p>"},{"location":"build-provider/access-log-configuration.html#_6","title":"\u76f8\u5173\u7c7b\u8bf4\u660e","text":"<ol> <li>AccessLogItem</li> </ol> <pre><code>public interface AccessLogItem&lt;T&gt; {\n // \u4eceServer\u7aef\u83b7\u53d6\u4fe1\u606f\uff0c\u6253\u5370 Access Log \u65e5\u5fd7\n default void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {\n }\n\n // \u4eceClient \u7aef\u83b7\u53d6\u4fe1\u606f\uff0c \u6253\u5370 Request Log\n default void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {\n }\n}\n</code></pre> <p>AccessLogItem \u7684\u5b9a\u4e49\u5982\u4e0a\u6240\u793a</p> <ul> <li> <p>Server \u7aef \u6bcf\u6536\u5230\u4e00\u4e2a\u8bf7\u6c42\uff0c\u4f1a\u89e6\u53d1\u4e00\u6b21 Access Log \u65e5\u5fd7\u6253\u5370\u3002Client \u7aef \u6bcf\u6b21\u5bf9\u5916\u8fdc\u7a0b\u8c03\u7528\u7ed3\u675f\uff0c\u4f1a\u89e6\u53d1\u4e00\u6b21 Request Log \u65e5\u5fd7\u6253\u5370\u3002 </p> </li> <li> <p>\u6bcf\u6b21\u65e5\u5fd7\u6253\u5370\uff0cSDK \u90fd\u4f1a\u904d\u5386\u6709\u6548\u7684 <code>AccessLogItem</code> \uff0c\u8c03\u7528\u5bf9\u5e94\u7684\u65b9\u6cd5\u83b7\u53d6\u6b64 Item \u751f\u6210\u7684 Log\u7247 \u6bb5\uff0c\u5e76\u5c06\u5168\u90e8\u7247\u6bb5\u62fc\u63a5\u6210\u4e00\u6761 Log \u6253\u5370\u5230\u65e5\u5fd7\u6587\u4ef6\u4e2d\u3002 </p> </li> </ul> <ol> <li>VertxRestAccessLogItemMeta</li> </ol> <pre><code> // pattern\u5360\u4f4d\u7b26\u524d\u7f00\n protected String prefix;\n // pattern\u5360\u4f4d\u7b26\u540e\u7f00\n protected String suffix;\n // \u4f18\u5148\u7ea7\u5e8f\u53f7\n protected int order;\n // AccessLogItem\u6784\u9020\u5668\n protected AccessLogItemCreator&lt;RoutingContext&gt; accessLogItemCreator;\n</code></pre> <p><code>VertxRestAccessLogItemMeta</code> \u5305\u542b\u5982\u4e0a\u5c5e\u6027\uff0c\u5b83\u5b9a\u4e49\u4e86 ServiceComb \u5982\u4f55\u89e3\u6790 pattern \u5b57\u7b26\u4e32\u4ee5\u83b7\u5f97\u7279\u5b9a\u7684 AccessLogItem\u3002</p> <ul> <li> <p>\u5982\u679c\u7528\u6237\u60f3\u8981\u5b9a\u4e49\u4e00\u4e2a\u5360\u4f4d\u7b26\u4e3a <code>%user-defined</code> \u7684 <code>AccessLogItem</code> \uff0c\u5219\u9700\u8981\u58f0\u660e\u4e00\u4e2a <code>VertxRestAccessLogItemMeta</code> \u7684\u5b50\u7c7b\uff0c\u8bbe\u7f6e prefix=\"%user-defined\"\uff0csuffix=null\uff0c\u5f53 <code>AccessLogPatternParser</code> \u89e3\u6790\u5230 \"%user-defined\" \u65f6\uff0c\u4ece\u6b64 meta \u7c7b\u4e2d\u53d6\u5f97 <code>AccessLogItemCreator</code> \u521b\u5efa\u5bf9\u5e94\u7684 <code>AccessLogItem</code>\u3002\u6ce8\u610f\uff1a\u7531\u4e8e \"%user-defined\" \u5360\u4f4d\u7b26\u4e2d\u6ca1\u6709\u53d8\u91cf\u90e8\u5206\uff0c\u56e0\u6b64\u8c03\u7528 <code>AccessLogItemCreator</code> \u4f20\u5165\u7684\u914d\u7f6e\u53c2\u6570\u4e3anull\u3002</p> </li> <li> <p>\u5982\u679c\u7528\u6237\u60f3\u8981\u5b9a\u4e49\u4e00\u4e2a\u5360\u4f4d\u7b26\u4e3a <code>%{VARNAME}user-defined</code> \u7684 <code>AccessLogItem</code>\uff0c\u5219\u58f0\u660e\u7684 <code>VertxRestAccessLogItemMeta</code> \u5b50\u7c7b\u4e2d\uff0c\u8bbe\u7f6eprefix=\"%{\"\uff0csuffix=\"}user-defined\"\uff0c\u5f53 <code>AccessLogPatternParser</code> \u89e3\u6790\u5230 \"%{VARNAME}user-defined\"\u65f6\uff0c\u4f1a\u622a\u53d6\u51fa\"VARNAME\"\u4f5c\u4e3a\u914d\u7f6e\u53c2\u6570\u4f20\u5165<code>AccessLogItemCreator</code>\uff0c\u521b\u5efa\u4e00\u4e2a<code>AccessLogItem</code>\u3002</p> </li> </ul> <p><code>VertxRestAccessLogItemMeta</code> \u6709\u4e00\u4e2a\u5b50\u7c7b <code>CompositeVertxRestAccessLogItemMeta</code>\uff0c\u5f53\u7528\u6237\u9700\u8981\u5b9a\u4e49\u591a\u4e2a AccessLogItem \u65f6\uff0c\u53ef\u4ee5\u5c06\u591a\u4e2a <code>VertxRestAccessLogItemMeta</code> \u805a\u5408\u5230 <code>CompositeVertxRestAccessLogItemMeta</code> \u4e2d\u3002Parser \u52a0\u8f7d\u5230\u7c7b\u578b\u4e3a <code>CompositeVertxRestAccessLogItemMeta</code> \u7684AccessLogItemMeta\u65f6\uff0c\u4f1a\u8c03\u7528\u5176 <code>getAccessLogItemMetas()</code> \u65b9\u6cd5\u83b7\u5f97\u4e00\u7ec4 AccessLogItemMeta\u3002<code>VertxRestAccessLogItemMeta</code> \u4f7f\u7528SPI\u673a\u5236\u52a0\u8f7d\uff0c\u800c<code>CompositeVertxRestAccessLogItemMeta</code>\u53ef\u4ee5\u8ba9\u7528\u6237\u53ea\u5728SPI\u914d\u7f6e\u6587\u4ef6\u4e2d\u914d\u7f6e\u4e00\u6761\u8bb0\u5f55\u5c31\u52a0\u8f7d\u591a\u6761meta\u4fe1\u606f\uff0c\u7ed9\u4e86\u7528\u6237\u66f4\u7075\u6d3b\u7684\u9009\u62e9\u3002</p> <ol> <li>AccessLogItemCreator</li> </ol> <pre><code>public interface AccessLogItemCreator&lt;T&gt; {\n // \u63a5\u6536\u914d\u7f6e\u503c\uff0c\u8fd4\u56de\u4e00\u4e2aAccessLogItem\u3002\u5982\u679cAccessLogItem\u7684\u5360\u4f4d\u7b26\u6ca1\u6709\u53ef\u53d8\u7684\u914d\u7f6e\u503c\u90e8\u5206\uff0c\u5219\u6b64\u65b9\u6cd5\u4f1a\u63a5\u6536\u5230null\u3002\n AccessLogItem&lt;T&gt; createItem(String config);\n}\n</code></pre> <p>\u7528\u6237\u901a\u8fc7\u8bbe\u7f6e\u5728\u81ea\u5b9a\u4e49\u7684 <code>VertxRestAccessLogItemMeta</code> \u4e2d\u7684 <code>AccessLogItemCreator</code> \u5b9e\u4f8b\u5316\u81ea\u5df1\u7684 <code>AccessLogItem</code>\u3002\u7531\u4e8e\u8fd9\u662f\u4e00\u4e2a\u51fd\u6570\u5f0f\u63a5\u53e3\uff0c\u5f53 <code>AccessLogItem</code> \u7684\u521d\u59cb\u5316\u65b9\u5f0f\u8f83\u7b80\u5355\u65f6\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 Lambda\u8868\u8fbe\u5f0f\u5b9a\u4e49Creator\uff0c\u4ee5\u7b80\u5316\u5f00\u53d1\u3002</p>"},{"location":"build-provider/access-log-configuration.html#accesslogitemmeta","title":"AccessLogItemMeta \u7684\u5339\u914d\u89c4\u5219","text":"<p>AccessLogItemMeta \u52a0\u8f7d\u8fdb Parser \u540e\uff0c\u4f1a\u8fdb\u884c\u4e00\u6b21\u6392\u5e8f\u3002Parser \u89e3\u6790 pattern \u4e32\u65f6\u4f1a\u4ece\u524d\u5230\u540e\u5339\u914d meta list\uff0c\u603b\u7684\u5339\u914d\u89c4\u5219\u5982\u4e0b\uff1a</p> <ol> <li> <p>\u4f18\u5148\u5339\u914d\u9ad8\u4f18\u5148\u7ea7\u7684meta\u3002</p> </li> <li> <p>\u4f18\u5148\u5339\u914d\u6709\u540e\u7f00\u7684meta\uff0c\u5f53\u5339\u914d\u4e0a\u591a\u4e2a\u6709\u540e\u7f00meta\u65f6\uff0c\u53d6\u524d\u540e\u7f00\u76f8\u8ddd\u6700\u5c0f\u7684\u4e00\u4e2a\u3002</p> </li> <li> <p>\u4f18\u5148\u5339\u914d\u5360\u4f4d\u7b26\u957f\u7684meta\uff0c\u4f8b\u5982\u6709\u4e24\u4e2a meta\uff0c\"%abc\"\u548c\"%a\"\uff0c\u5982\u679c\u5339\u914d\u4e2d\u4e86\"%abc\"\u5219\u76f4\u63a5\u8fd4\u56de\uff0c\u4e0d\u518d\u5339\u914d\"%a\"\u3002</p> </li> </ol>"},{"location":"build-provider/access-log-configuration.html#_7","title":"\u793a\u4f8b\u8bf4\u660e","text":"<ol> <li>\u6269\u5c55\u81ea\u5b9a\u4e49 AccessLogItem</li> </ol> <p>\u9996\u5148\u7528\u6237\u9700\u8981 <code>AccessLogItem</code> \u63a5\u53e3\u5b9e\u73b0\u81ea\u5df1\u7684 item\uff1a</p> <pre><code>public class UserDefinedAccessLogItem implements AccessLogItem&lt;RoutingContext&gt; {\n private String config;\n\n public UserDefinedAccessLogItem(String config) {\n this.config = config;\n }\n\n @Override\n public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {\n builder.append(\"user-defined--server-\")\n .append(accessLogEvent.getRoutingContext().response().getStatusCode())\n .append(\"-\")\n .append(config);\n }\n\n @Override\n public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {\n builder.append(\"user-server-defined-\")\n .append(clientLogEvent.getResponse().getStatus())\n .append(\"-\")\n .append(config);\n }\n}\n</code></pre> <ol> <li>\u5b9a\u4e49 AccessLogItem \u7684 meta \u7c7b</li> </ol> <p>\u7ee7\u627f <code>VertxRestAccessLogItemMeta</code> \u6216 <code>CompositeVertxRestAccessLogItemMeta</code> \u7c7b\uff0c\u5b9a\u4e49AccessLogItem\u7684\u524d\u540e\u7f00\u7b49\u4fe1\u606f\uff1a</p> <pre><code>public class UserDefinedCompositeExtendedAccessLogItemMeta extends CompositeVertxRestAccessLogItemMeta {\n private static final List&lt;VertxRestAccessLogItemMeta&gt; META_LIST = new ArrayList&lt;&gt;();\n\n static {\n META_LIST.add(new VertxRestAccessLogItemMeta(\"%{\", \"}user-defined\", UserDefinedAccessLogItem::new));\n }\n\n @Override\n public List&lt;VertxRestAccessLogItemMeta&gt; getAccessLogItemMetas() {\n return META_LIST;\n }\n}\n</code></pre> <ol> <li>\u914d\u7f6eSPI\u52a0\u8f7d\u6587\u4ef6</li> </ol> <p>\u5728 <code>resources/META-INF/services/</code> \u76ee\u5f55\u4e0b\u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3a \"org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta\" \u7684\u6587\u4ef6\uff0c\u5c06\u4e0a\u4e00\u6b65\u4e2d\u5b9a\u4e49\u7684meta\u7c7b\u5b8c\u6574\u7c7b\u540d\u586b\u5199\u5230\u8be5\u6587\u4ef6\u4e2d\uff0c\u4f9bParser\u52a0\u8f7dmeta\u7c7b\u3002</p> <ol> <li>\u914d\u7f6e Access Log \u7684 pattern</li> </ol> <pre><code># \u670d\u52a1\u7aef\u914d\u7f6e\nservicecomb:\n accesslog:\n enabled: true ## \u5e94\u7528\u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u5f00\u542f Access log\n pattern: \"%{param}user-defined\" ## Access log \u65e5\u5fd7\u683c\u5f0f\n request: \n enabled: true ## \u5e94\u7528\u4f5c\u4e3a\u5ba2\u6237\u7aef\uff0c\u5f00\u542f Request log\n pattern: \"%{param}user-defined\" ## Request log \u65e5\u5fd7\u683c\u5f0f\n</code></pre> <p>\u4ee5\u670d\u52a1\u7aef\u4e3a\u4f8b\uff0c \u8fd0\u884c\u670d\u52a1\u89e6\u53d1Access Log\u6253\u5370\uff0c\u5047\u8bbe\u8bf7\u6c42\u8fd4\u56de\u72b6\u6001\u7801\u662f 200\uff0c\u5219\u53ef\u4ee5\u770b\u5230Access Log\u6253\u5370\u5185\u5bb9\u4e3a \"<code>user-defined--server-200-param</code>\"\u3002</p>"},{"location":"build-provider/basics.html","title":"\u57fa\u7840\u6982\u5ff5","text":"<p>Java Chassis \u662f\u4ee5 OpenAPI \u4e3a\u57fa\u7840\u7684\u5fae\u670d\u52a1\u5f00\u53d1\u6846\u67b6\u3002\u4e00\u4e2a\u5fae\u670d\u52a1\u63d0\u4f9b\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u901a\u8fc7 OpenAPI \u8fdb\u884c\u63cf\u8ff0\uff0c\u5f00\u53d1\u4efb\u52a1\u5c31\u662f\u5b9e\u73b0\u8fd9\u4e9b OpenAPI \u63cf\u8ff0\u7684\u529f\u80fd\u3002 \u53ef\u4ee5\u5c06\u4e00\u4e2a\u5fae\u670d\u52a1\u5f00\u53d1\u5206\u4e3a\u4e24\u4e2a\u57fa\u7840\u6027\u7684\u5de5\u4f5c\uff1a</p> <ul> <li>\u5b9a\u4e49\u5fae\u670d\u52a1\u7684\u529f\u80fd\u3002</li> <li>\u5b9e\u73b0\u5fae\u670d\u52a1\u7684\u529f\u80fd\u3002</li> </ul> <p>Java Chassis\u63d0\u4f9b\u4e863\u79cd\u65b9\u5f0f\u5b9a\u4e49\u5fae\u670d\u52a1\u529f\u80fd\uff1a</p> <ul> <li>Spring Web MVC: \u7b80\u79f0SpringMVC\u3002Spring Web MVC\u662fSpring Boot\u63d0\u4f9b\u7684\u4e00\u7ec4\u63cf\u8ff0 <code>REST</code> \u63a5\u53e3\u7684\u6ce8\u89e3\u3002</li> <li>JAX-RS: JAX-RS \u662f Java SE \u548c Java EE \u63d0\u4f9b\u7684\u4e00\u7ec4\u63cf\u8ff0 <code>REST</code> \u63a5\u53e3\u7684\u6ce8\u89e3\u3002</li> <li>PRC: RPC\u662f\u4e00\u79cd\u7b80\u6d01\u7684\u5f00\u53d1\u6a21\u5f0f\uff0c\u7528\u6237\u65e0\u9700\u901a\u8fc7\u6ce8\u89e3\u63cf\u8ff0 <code>REST</code> \u63a5\u53e3\uff0cJava Chassis\u901a\u8fc7\u7cfb\u7edf\u9ed8\u8ba4\u7684\u89c4\u5219\uff0c\u5c06\u670d\u52a1\u5b9a\u4e49\u6620\u5c04\u4e3a OpenAPI \u7684\u63cf\u8ff0\u3002 </li> </ul> <p>\u5c3d\u7ba1Java Chassis\u652f\u6301\u5728\u4e00\u4e2a\u5fae\u670d\u52a1\u4e2d\u6df7\u5408\u4f7f\u7528\u4e0a\u8ff0\u51e0\u79cd\u65b9\u5f0f\uff0c\u9879\u76ee\u4e2d\u901a\u5e38\u53ea\u4f1a\u9009\u62e9\u4e00\u79cd\u65b9\u5f0f\u3002\u4ece\u4f7f\u7528\u5e7f\u6cdb\u6027\u7684\u89d2\u5ea6\uff0c\u63a8\u8350Spring Web MVC\u3002 </p> <p>Spring Web MVC \u7684\u4f8b\u5b50\uff1a</p> <pre><code>@RestSchema(schemaId = \"HelloWorld\")\n@RequestMapping(\"/\")\npublic class SpringMVCExample {\n @PostMapping(\"/helloWorld\")\n public String helloWorld(@RequestBody String name) {\n return \"Hello \" + name;\n }\n}\n</code></pre> <p>JAX-RS \u7684\u4f8b\u5b50\uff1a</p> <pre><code>@RestSchema(schemaId = \"HelloWorld\")\n@Path(\"/\")\npublic class JAXRSExample {\n @POST\n @Path(\"/helloWorld\")\n public String helloWorld(String name) {\n return \"Hello \" + name;\n }\n}\n</code></pre> <p>\u8fd9\u4e24\u79cd\u5199\u6cd5\u603b\u4f53\u4e0a\u662f\u7b49\u4ef7\u7684\uff0c\u4ed6\u4eec\u90fd\u5b9a\u4e49\u4e86\u5982\u4e0b\u4f7f\u7528 OpenAPI \u63cf\u8ff0\u7684\u670d\u52a1\uff1a</p> <pre><code>openapi: 3.0.1\ninfo:\n version: 1.0.0\nservers:\n- url: /\npaths:\n /helloWorld:\n post:\n operationId: helloWorld\n requestBody:\n content:\n application/json:\n schema:\n type: string\n application/protobuf:\n schema:\n type: string\n text/plain:\n schema:\n type: string\n x-name: name\n responses:\n \"200\":\n description: response of 200\n content:\n application/json:\n schema:\n type: string\n application/protobuf:\n schema:\n type: string\n text/plain:\n schema:\n type: string\ncomponents: {}\n</code></pre> <p>RPC \u7684\u4f8b\u5b50\uff1a</p> <pre><code>@RpcSchema(schemaId = \"HelloWorld\")\npublic class RPCExample {\n public String helloWorld(String name) {\n return \"Hello \" + name;\n }\n}\n</code></pre> <p>\u8fd9\u4e2a\u670d\u52a1\u4f7f\u7528 OpenAPI \u63cf\u8ff0\u5982\u4e0b\u3002 \u53ef\u4ee5\u770b\u51fa RPC \u63a5\u53e3\u90fd\u4f1a\u88ab\u63cf\u8ff0\u4e3a <code>POST</code> \u65b9\u6cd5\uff0c\u53c2\u6570\u90fd\u4f1a\u4f7f\u7528 <code>RequestBody</code> \u8fdb\u884c\u5305\u88c5\u3002 RPC\u6a21\u5f0f\u901a\u5e38\u7528\u4e8e\u4f7f\u7528\u8005\u4e0d\u5173\u6ce8 <code>REST</code> \u89c4\u8303\u7684\u573a\u666f\uff0cJava Chassis\u7684\u670d\u52a1\u63cf\u8ff0\u6587\u4ef6\uff0c\u7ed9\u7b2c\u4e09\u65b9\u5de5\u5177\u6d4b\u8bd5 RPC \u63a5\u53e3\u63d0\u4f9b\u4e86\u4fbf\u5229\u3002 </p> <pre><code>openapi: 3.0.1\ninfo:\n version: 1.0.0\nservers:\n- url: /\npaths:\n /helloWorld:\n post:\n operationId: helloWorld\n requestBody:\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/helloWorldBody'\n application/protobuf:\n schema:\n $ref: '#/components/schemas/helloWorldBody'\n text/plain:\n schema:\n $ref: '#/components/schemas/helloWorldBody'\n x-name: helloWorldBody\n responses:\n \"200\":\n description: response of 200\n content:\n application/json:\n schema:\n type: string\n application/protobuf:\n schema:\n type: string\n text/plain:\n schema:\n type: string\ncomponents:\n schemas:\n helloWorldBody:\n type: object\n properties:\n name:\n type: string\n</code></pre> <ul> <li>\u4f7f\u7528 <code>OpenAPI</code> \u6ce8\u89e3</li> </ul> <p>Spring Web MVC \u548c JAX-RS \u6ce8\u89e3\u53ea\u5b9a\u4e49\u4e86\u4e00\u4e9b\u57fa\u7840\u7684\u670d\u52a1\u63cf\u8ff0\u529f\u80fd\uff0c\u6bd4\u5982\u53c2\u6570\u3001\u8fd4\u56de\u503c\u7b49\u4fe1\u606f\u3002 \u5982\u679c\u9700\u8981\u66f4\u52a0\u7ec6\u7c92\u5ea6\u7684\u63cf\u8ff0\u670d\u52a1\uff0c\u8fd8\u9700\u8981\u501f\u52a9 <code>OpenAPI</code> \u6ce8\u89e3\u3002 <code>OpenAPI</code> \u6ce8\u89e3\u53ef\u4ee5\u57283\u79cd\u6a21\u5f0f\u4e0b\u6df7\u5408\u4f7f\u7528\u3002\u6bd4\u5982\u901a\u8fc7 <code>OpenAPIDefinition</code> \u548c <code>Operation</code> \u4e24\u4e2a\u6ce8\u89e3\uff0c\u7ed9Spring Web MVC\u7684\u670d\u52a1\u589e\u52a0\u4e86\u5206\u7ec4\u548c\u63a5\u53e3\u552f\u4e00\u6807\u8bc6\u3002 \u5229\u7528<code>OpenAPI</code> \u6ce8\u89e3\u80fd\u591f\u66f4\u6e05\u6670\u7684\u63cf\u8ff0\u670d\u52a1\u529f\u80fd\u3001\u793a\u4f8b\u3001\u5b89\u5168\u6027\u7b49\u65b9\u9762\u7684\u7ea6\u675f\u3002</p> <pre><code>@RestSchema(schemaId = \"SpringMVCExample\")\n@RequestMapping(\"/\")\n@OpenAPIDefinition(tags = {@Tag(name = \"example\")})\npublic class SpringMVCExample {\n @Operation(operationId = \"spring-mvc-example\")\n @PostMapping(\"/helloWorld\")\n public String helloWorld(@RequestBody String name) {\n return \"Hello \" + name;\n }\n}\n</code></pre> <ul> <li>\u670d\u52a1\u5b9a\u4e49\u548c\u670d\u52a1\u5b9e\u73b0\u5206\u79bb</li> </ul> <p>\u4e3a\u4e86\u66f4\u597d\u7684\u7ba1\u7406\u670d\u52a1\u5b9a\u4e49\u548c\u5b9e\u73b0\uff0c\u5c06\u670d\u52a1\u5b9a\u4e49\u548c\u5b9e\u73b0\u5206\u79bb\u662f\u4e00\u4e2a\u597d\u7684\u5de5\u7a0b\u5b9e\u8df5\u3002 Java Chassis\u63d0\u4f9b\u4e86\u76f8\u5173\u652f\u6301\u3002 </p> <p>\u670d\u52a1\u5b9a\u4e49\u5728\u5355\u72ec\u7684 interface \u91cc\u9762\u63cf\u8ff0\uff1a</p> <pre><code>@OpenAPIDefinition(tags = {@Tag(name = \"example\")})\n@RequestMapping(\"/\")\npublic interface ExampleService {\n @Operation(operationId = \"spring-mvc-example\")\n @PostMapping(\"/helloWorld\")\n String helloWorld(@RequestBody String name);\n}\n</code></pre> <p>\u670d\u52a1\u5b9e\u73b0\uff1a</p> <pre><code>@RestSchema(schemaId = \"SpringMVCExample\", schemaInterface = ExampleService.class)\npublic class SpringMVCExample implements ExampleService {\n @Override\n public String helloWorld(String name) {\n return \"Hello \" + name;\n }\n}\n</code></pre>"},{"location":"build-provider/bootup.html","title":"\u7a0b\u5e8f\u542f\u52a8\u903b\u8f91","text":""},{"location":"build-provider/bootup.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u542f\u52a8\u8fc7\u7a0b\u5206\u4e3a\u521d\u59cb\u5316Log4j\u3001bean\u52a0\u8f7d\uff08\u5305\u62ec\u914d\u7f6e\u52a0\u8f7d\uff09\u548c\u670d\u52a1\u6ce8\u518c\u4e09\u90e8\u5206\u3002</p> <ul> <li>\u521d\u59cb\u5316Log4j</li> </ul> <p><code>Log4jUtils</code>\u9ed8\u8ba4\u4f1a\u4ece<code>classpath\\*:config/base/log4j.properties</code>\u548c<code>classpath\\*:config/log4j.properties</code>\u4e24\u4e2a\u8def\u5f84\u8bfb\u53d6log4j\u914d\u7f6e\u5e76\u5408\u5e76\uff0c\u5c06\u5176\u4f20\u9012\u7ed9Log4j\u7684<code>PropertyConfigurator</code>\u65b9\u6cd5\u521d\u59cb\u5316Log4j\u3002\u5982\u679c\u4f18\u5148\u7ea7\u6700\u9ad8\u7684\u914d\u7f6e\u6587\u4ef6\u662f\u5728\u78c1\u76d8\u4e0a\uff0c\u4e14\u5176\u6240\u5728\u76ee\u5f55\u6709\u5199\u6743\u9650\uff0c\u5219\u5c06\u5408\u5e76\u7684\u914d\u7f6e\u8f93\u51fa\u5230\u8be5\u76ee\u5f55\uff0c\u4ee5\u4fbf\u4e8e\u7ef4\u62a4\u65f6\u89c2\u5bdf\u751f\u6548\u7684\u53c2\u6570\u3002</p> <ul> <li>bean\u52a0\u8f7d</li> </ul> <p><code>BeanUtils</code>\u9ed8\u8ba4\u4f1a\u4ece<code>classpath\\*:META-INF/spring/\\*.bean.xml</code>\u8def\u5f84\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u5c06\u5176\u4f20\u9012\u7ed9Spring\u6846\u67b6\u7684<code>ClassPathXmlApplicationContext</code>\u5b8c\u6210\u5e94\u7528\u4e0a\u4e0b\u6587\u52a0\u8f7d\u3002\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u4f1a\u52a0\u8f7dfoundation-config\u6a21\u5757\u7684bean\uff0c\u5b8c\u6210\u914d\u7f6e\u52a0\u8f7d\u3002</p> <ul> <li>\u670d\u52a1\u6ce8\u518c</li> </ul> <p>\u5728Spring context\u52a0\u8f7d\u5b8c\u6210\u540e\uff0c<code>org.apache.servicecomb.core.CseApplicationListener</code>\u4f1a\u52a0\u8f7dhandler\u914d\u7f6e\u3001\u52a0\u8f7dprovider\u7684schema\u4fe1\u606f\uff0c\u6700\u540e\u5c06\u5fae\u670d\u52a1\u4fe1\u606f\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u3002</p> <p>\u8bf4\u660e\uff1a ServiceComb\u7684\u914d\u7f6e\u9879\u5206\u4e3a\u4e09\u4e2a\u5c42\u6b21\uff1a\u914d\u7f6e\u4e2d\u5fc3\u3001\u73af\u5883\u53d8\u91cf\u3001\u672c\u5730\u6587\u4ef6\uff0c\u4e09\u8005\u4f18\u5148\u7ea7\u4f9d\u6b21\u9012\u51cf\uff0c\u9ad8\u4f18\u5148\u7ea7\u4e2d\u7684\u914d\u7f6e\u9879\u8986\u76d6\u4f4e\u4f18\u5148\u7ea7\u540c\u540d\u914d\u7f6e\u9879\u3002\u5b58\u653e\u5728\u914d\u7f6e\u4e2d\u5fc3\u7684\u914d\u7f6e\u9879\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u4fee\u6539\u3002</p>"},{"location":"build-provider/context-param.html","title":"\u4f7f\u7528 Context \u53c2\u6570","text":"<p>Context \u53c2\u6570\u6307\u5728\u63a5\u53e3\u58f0\u660e\u4e2d\u7684\u7279\u6b8a\u53c2\u6570\uff0c\u8fd9\u4e9b\u53c2\u6570\u4fe1\u606f\u4e0d\u4f1a\u51fa\u73b0\u5728\u6700\u7ec8\u7684\u5951\u7ea6\u4fe1\u606f\u4e2d\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u4f7f\u7528 Context \u53c2\u6570 \u83b7\u53d6\u6216\u8005\u4f20\u9012\u4e0e\u8fd0\u884c\u65f6\u6709\u5173\u7684\u4fe1\u606f\u3002 </p> <ul> <li>HttpServletRequest</li> </ul> <p>HttpServletRequest \u7528\u4e8e\u83b7\u53d6\u548cHTTP\u8bf7\u6c42\u6709\u5173\u7684\u4fe1\u606f\uff0c\u6bd4\u5982 header \u7b49\u3002\u5f53 servicecomb \u8fd0\u884c\u4e8e <code>Highway</code> \u534f\u8bae\uff0c\u6216\u8005\u8fd0\u884c\u4e8e <code>vert.x</code> \u670d\u52a1\u5668\u4e4b\u4e0a\u7684\u65f6\u5019\uff0c\u4ecd\u7136\u53ef\u4ee5\u4f7f\u7528\u3002 \u4f46\u662f\u9700\u8981\u6ce8\u610f\uff0c\u548c JSP/Servlet \u534f\u8bae\u6807\u51c6\u7684\u5b9e\u73b0 \u4e0d\u540c\uff0c \u5f00\u53d1\u8005\u65e0\u6cd5\u901a\u8fc7 HttpServletRequest \u64cd\u4f5c\u6d41\uff0c\u53ea\u80fd\u591f\u8fdb\u884c\u4e00\u4e9b\u7b80\u5355\u7684\u83b7\u53d6 header \u7b49\u64cd\u4f5c\u3002\u6bd4\u5982\u4e0b\u9762\u7684\u4f8b\u5b50\uff0c \u83b7\u53d6 query \u53c2\u6570\uff1a</p> <pre><code> ```java\n @GetMapping(path = \"/reduce\")\n @ApiImplicitParams({@ApiImplicitParam(name = \"a\", dataType = \"integer\", format = \"int32\", paramType = \"query\")})\n public int reduce(HttpServletRequest request, @CookieValue(name = \"b\") int b) {\n int a = Integer.parseInt(request.getParameter(\"a\"));\n return a - b;\n }\n ```\n</code></pre> <p>\u7279\u522b\u9700\u8981\u6ce8\u610f\uff0c\u5982\u679c\u8bf7\u6c42\u4e0d\u662f\u76f4\u63a5\u5230\u8fbe provider\uff0c \u800c\u662f\u7ecf\u8fc7 servicecomb \u7684 Edge Service \u8f6c\u53d1\u5230 provider\uff0c \u4e0a\u9762\u7684\u4ee3\u7801\u8fd8\u5fc5\u987b\u4f7f\u7528 <code>@ApiImplicitParams</code> \u663e\u793a\u7684\u58f0\u660e\u8fd9\u4e2a\u63a5\u53e3\u7684\u5b9e\u73b0\u901a\u8fc7 <code>HttpServletRequest</code> \u8bfb\u53d6\u4e86 query \u53c2\u6570 <code>a</code>\uff0c \u5982\u679c\u4e0d\u58f0\u660e\uff0c Edge Service \u505a\u8bf7\u6c42\u8f6c\u53d1\u7684\u65f6\u5019\uff0c\u4e0d\u4f1a\u8f6c\u53d1\u53c2\u6570 <code>a</code>\uff0c \u4ee3\u7801\u4e2d\u8bfb\u53d6\u7684\u53c2\u6570\u503c\u4e3a null\u3002</p> <p>\u8fd8\u9700\u8981\u6ce8\u610f\uff0cservicecomb \u4e0d\u652f\u6301 <code>HttpServletResponse</code> Context \u53c2\u6570\u3002</p> <ul> <li>InvocationContext</li> </ul> <p>InvocationContext \u662f servicecomb \u7279\u6709\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\uff0c\u53ef\u4ee5\u5728 <code>Handler</code>, <code>HttpServerFilter</code> \u7b49 \u591a\u79cd\u573a\u666f\u4f7f\u7528\u3002 InvocationContext \u5305\u542b local \u548c context \u4e24\u79cd\u6570\u636e\uff0c local \u6570\u636e\u53ea\u5728\u672c\u8fdb\u7a0b\u7684\u6a21\u5757\u95f4 \u4f20\u9012\uff0c context \u6570\u636e\u53ef\u4ee5\u5728\u5fae\u670d\u52a1\u4e4b\u95f4\u4f20\u9012\u3002 </p> <pre><code> ```java\n @ApiResponse(code = 202, response = User.class, message = \"\")\n @ResponseHeaders({@ResponseHeader(name = \"h1\", response = String.class),\n @ResponseHeader(name = \"h2\", response = String.class)})\n @RequestMapping(path = \"/cseResponseCorrect\", method = RequestMethod.GET)\n public Response cseResponseCorrect(InvocationContext c1) {\n Response response = Response.createSuccess(Status.ACCEPTED, new User());\n Headers headers = response.getHeaders();\n headers.addHeader(\"h1\", \"h1v \" + c1.getContext().get(Const.SRC_MICROSERVICE));\n\n InvocationContext c2 = ContextUtils.getInvocationContext();\n headers.addHeader(\"h2\", \"h2v \" + c2.getContext().get(Const.SRC_MICROSERVICE));\n\n return response;\n }\n ```\n</code></pre> <p>\u4e0a\u9762\u7684\u4ee3\u7801\u663e\u793a\u4e86 InvocationContext \u53c2\u6570\u7684\u7528\u6cd5\uff0c \u8fd9\u4e2a\u7528\u6cd5\u548c\u4ee3\u7801\u4e2d\u901a\u8fc7 ContextUtils.getInvocationContext() \u83b7\u53d6\u662f\u7b49\u4ef7\u7684\u3002</p> <p>InvocationContext \u8fd8\u53ef\u4ee5\u5728 consumer \u7aef\u7684 RPC \u63a5\u53e3\u4e2d\u4f7f\u7528\uff0c \u4f7f\u7528Context\u4f20\u9012\u63a7\u5236\u6d88\u606f \u63cf\u8ff0\u4e86\u66f4\u591a InvocationContext \u7684\u4f7f\u7528 \u573a\u666f\u3002</p> <ul> <li>Endpoint</li> </ul> <p>Endpoint \u63cf\u8ff0\u5f53\u524d\u8bf7\u6c42\u9700\u8981\u53d1\u5f80\u7684\u5b9e\u4f8b\u5730\u5740\u3002 \u8fd9\u4e2a context \u53c2\u6570\u53ea\u80fd\u591f\u5728 consumer \u7aef\u7684 PRC \u63a5\u53e3\u4f7f\u7528\u3002\u5f53 \u5fae\u670d\u52a1\u5b58\u5728\u591a\u4e2a\u5b9e\u4f8b\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u6307\u5b9a\u5c06\u8bf7\u6c42\u53d1\u5f80\u54ea\u4e2a\u5b9e\u4f8b\u3002 </p> <pre><code> ```java\n public interface SchemaDiscoveryService {\n String getSchema(Endpoint endpoint, String schemaId);\n }\n\n SchemaDiscoveryService schemaDiscoveryService = Invoker\n .createProxy(serviceName, SchemaDiscoveryService.SCHEMA_ID,\n SchemaDiscoveryService.class);\n\n schemaDiscoveryService.getSchema(EndpointUtils.parse(endpoint), schemaId);\n ```\n</code></pre>"},{"location":"build-provider/define-contract.html","title":"\u7406\u89e3\u670d\u52a1\u5951\u7ea6","text":"<p>servicecomb \u7684\u6838\u5fc3\u8bbe\u8ba1\u7406\u5ff5\u662f <code>\u4ee5\u5951\u7ea6\u4e3a\u4e2d\u5fc3</code>\uff0c\u5951\u7ea6\u662f\u5fae\u670d\u52a1\u7cfb\u7edf\u8fd0\u884c\u548c\u6cbb\u7406\u7684\u57fa\u7840\u3002 \u53ef\u4ee5\u5c06\u5951\u7ea6\u7406\u89e3\u4e3a\u57fa \u4e8e OpenAPI \u89c4\u8303\u7684\u5fae\u670d\u52a1\u63a5\u53e3\u63cf\u8ff0\u3002java chassis \u63d0\u4f9b\u4e86\u4e24\u79cd\u65b9\u5f0f\u5b9a\u4e49\u5951\u7ea6\uff1a<code>code first</code> \u548c <code>contract first</code> \u3002</p> <ul> <li>code first</li> </ul> <p>\u5f00\u53d1\u8005\u9996\u5148\u901a\u8fc7 JAVA \u4ee3\u7801\u5b9a\u4e49\u63a5\u53e3\u4fe1\u606f\uff0cservicecomb \u4f1a\u6839\u636e\u4ee3\u7801\u5b9a\u4e49\uff0c\u751f\u6210\u4ee5 yaml \u6587\u4ef6\u63cf\u8ff0\u7684 OpenAPI \u6587\u6863\u3002 servicecomb \u652f\u6301\u4f7f\u7528 <code>JAX-RS</code>, <code>Spring MVC</code> \u7b49 REST Annotation \u63cf\u8ff0\u63a5\u53e3\u4fe1\u606f\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7 swagger API \u8865\u5145\u5176\u4ed6\u63a5\u53e3\u4fe1\u606f\u3002 \u5728\u4f7f\u7528 <code>RPC</code> \u65b9\u5f0f\u5b9a\u4e49\u63a5\u53e3\u7684\u65f6\u5019\uff0c \u7cfb\u7edf\u4f1a\u6309\u7167\u9ed8\u8ba4\u7684\u89c4\u5219\u751f\u6210\u63a5\u53e3\u63cf\u8ff0\uff0c \u4e5f\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e9b\u6807\u7b7e\u4fee\u9970\u63a5\u53e3\u4fe1\u606f\uff0c\u8ba9\u5951\u7ea6\u4fe1\u606f\u66f4\u52a0\u5bb9\u6613\u9605\u8bfb\u548c\u7406\u89e3\u3002</p> <ul> <li>contract first</li> </ul> <p>\u5f00\u53d1\u8005\u5148\u901a\u8fc7\u5951\u7ea6\u7f16\u8f91\u5668\u4e66\u5199 yaml \u683c\u5f0f\u7684\u63a5\u53e3\u63cf\u8ff0\uff0c\u7136\u540e\u901a\u8fc7\u4ee3\u7801\u751f\u6210\u5de5\u5177\uff0c\u751f\u6210\u9879\u76ee\u4ee3\u7801\u3002\u8fd9\u79cd\u65b9\u5f0f\u901a\u5e38 \u9700\u8981\u5b9a\u4e49\u4e00\u5957\u6807\u51c6\u7684\u8f6f\u4ef6\u5de5\u7a0b\u89c4\u8303\uff0c\u5e76\u63d0\u4f9b\u76f8\u5173\u7684\u5de5\u5177\u652f\u6301\u3002\u8fd9\u79cd\u65b9\u5f0f\u66f4\u52a0\u5bb9\u6613\u5b9e\u73b0\u63a5\u53e3\u89c4\u8303\u7ba1\u7406\uff0c\u5b9e\u73b0\u6d4b\u8bd5\u81ea\u52a8\u5316 \u7b49\u8f6f\u4ef6\u5de5\u7a0b\u6d41\u7a0b\u3002</p> <p>\u7531\u4e8e <code>contract first</code> \u5b9e\u8df5\u8d77\u6765\uff0c\u9700\u8981\u914d\u5957\u7684\u7ba1\u7406\u8fc7\u7a0b\u548c\u5de5\u5177\u4f53\u7cfb\u652f\u6301\uff0c\u8fd9\u91cc\u4e0d\u8be6\u7ec6\u63cf\u8ff0\uff0c \u672c\u7ae0\u8282\u7b80\u5355\u63cf\u8ff0\u5982\u4f55\u4e66\u5199\u5951\u7ea6\u3002\u540e\u7eed\u7684\u7ae0\u8282\u4f1a\u63cf\u8ff0\u4f7f\u7528 <code>code first</code> \u7684\u5f00\u53d1\u7ec6\u8282\u3002</p>"},{"location":"build-provider/define-contract.html#contract-first","title":"contract first \u5f00\u53d1\u6b65\u9aa4\u7b80\u8981\u63cf\u8ff0","text":"<p>ServiceComb \u4f7f\u7528 yaml \u6587\u4ef6\u683c\u5f0f\u5b9a\u4e49\u670d\u52a1\u5951\u7ea6\uff0c\u63a8\u8350\u4f7f\u7528Swagger Editor\u5de5\u5177\u6765\u7f16\u5199\u5951\u7ea6\uff0c \u53ef\u68c0\u67e5\u8bed\u6cd5\u683c\u5f0f\u53ca\u81ea\u52a8\u751f\u6210API\u6587\u6863\u3002\u8be6\u7ec6\u7684\u5951\u7ea6\u6587\u4ef6\u683c\u5f0f\u8bf7\u53c2\u8003OpenAPI\u5b98\u65b9\u6587\u6863\u3002</p> <p>\u5951\u7ea6\u6587\u4ef6\u653e\u7f6e\u5728 <code>resources/microservices</code> \u6216\u8005 <code>resources/application</code> \u76ee\u5f55\u4e0b\uff0c\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\u6240\u793a\u3002</p> <pre><code>resources\n - microservices \n - serviceName #\u5fae\u670d\u52a1\u540d \n - schemaId.yaml #schema\u63a5\u53e3\u7684\u5951\u7ea6\n - applications \n - appId #\u5e94\u7528ID \n - serviceName #\u5fae\u670d\u52a1\u540d \n - schemaId.yaml #schema\u63a5\u53e3\u7684\u5951\u7ea6\n</code></pre> <p>ServiceComb\u7684Swagger\u5951\u7ea6\u6587\u4ef6\u5e94\u5f53\u4f7f\u7528UTF-8\u5b57\u7b26\u96c6\u4fdd\u5b58\u3002\u5982\u679c\u5f53\u7528\u6237\u4f7f\u7528\u5176\u4ed6\u5b57\u7b26\u96c6\u4fdd\u5b58\u5951\u7ea6\u6587\u4ef6\uff0c\u4e14\u6587 \u4ef6\u4e2d\u5305\u542b\u4e2d\u6587\u5b57\u7b26\u65f6\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u672a\u77e5\u9519\u8bef\u3002</p>"},{"location":"build-provider/define-contract.html#_2","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p><code>resources/microservices</code>\u76ee\u5f55\u548c<code>resources/application</code> \u76ee\u5f55\u4e0b\u7684schemaId.yaml\u6587\u4ef6\u5185\u5bb9\u793a\u4f8b\u5982\u4e0b\u3002</p> <pre><code>swagger: '2.0'\ninfo:\n title: hello\n version: 1.0.0\n x-java-interface: org.apache.servicecomb.samples.common.schema.Hello\nbasePath: /springmvchello\nproduces:\n - application/json\n\npaths:\n /sayhi:\n post:\n operationId: sayHi\n parameters:\n - name: name\n in: query\n required: true\n type: string\n responses:\n 200:\n description: \u6b63\u786e\u8fd4\u56de\n schema:\n type: string\n default:\n description: \u9ed8\u8ba4\u8fd4\u56de\n schema:\n type: string\n /sayhello:\n post:\n operationId: sayHello\n parameters:\n - name: person\n in: body\n required: true\n schema:\n $ref: \"#/definitions/Person\"\n responses:\n 200:\n description: \u6b63\u786e\u8fd4\u56de\n schema:\n type: string\n default:\n description: \u9ed8\u8ba4\u8fd4\u56de\n schema:\n type: string\ndefinitions:\n Person:\n type: \"object\"\n properties:\n name:\n type: \"string\"\n description: \"person name\"\n xml:\n name: \"Person\"\n</code></pre> <p>ServiceComb\u4e2d\u7684\u5951\u7ea6\uff0cbasePath\u4e0d\u9700\u8981\u5305\u542bweb container\u7684web root\uff0c\u4ee5\u53caservlet\u7684url pattern\u3002 \u56e0\u4e3aServiceComb\u652f\u6301\u90e8\u7f72\u89e3\u8026\uff0c\u65e2\u53ef\u4ee5\u8131\u79bbservlet container\u72ec\u7acb\u90e8\u7f72\uff0c\u4e5f\u53ef\u4f7f\u7528war\u7684\u65b9\u5f0f\u90e8\u7f72 \u5230servlet container\u4e2d\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528embedded servlet container\u7684\u65b9\u5f0f\u8fd0\u884c\u3002 \u90e8\u7f72\u65b9\u5f0f\u4fee\u6539\u5bfc\u81f4\u7684\u5b9e\u9645url\u53d8\u66f4\uff0cServiceComb consumer\u4e1a\u52a1\u4ee3\u7801\u5e76\u4e0d\u9700\u8981\u611f\u77e5\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u9002\u914d\u3002 </p> <p>\u8bf4\u660e\uff1a</p> <ul> <li>info.x-java-interface\u9700\u8981\u6807\u660e\u5177\u4f53\u7684\u63a5\u53e3\u8def\u5f84\uff0c\u6839\u636e\u9879\u76ee\u5b9e\u9645\u60c5\u51b5\u800c\u5b9a\u3002\u8be5\u4fe1\u606f\u4e3b\u8981\u662f\u4e3a\u4e86\u548c\u8001\u7248\u672c\u517c\u5bb9\uff0c \u65b0\u7248\u672c\u53ef\u4ee5\u4e0d\u9700\u8981\u6307\u5b9a\u3002</li> <li>SchemaId\u4e2d\u53ef\u4ee5\u5305\u542b\".\"\u5b57\u7b26\uff0c\u4f46\u4e0d\u63a8\u8350\u8fd9\u6837\u547d\u540d\u3002\u8fd9\u662f\u7531\u4e8eServiceComb\u4f7f\u7528\u7684\u914d\u7f6e\u6587\u4ef6\u662fyaml\u683c\u5f0f\u7684\uff0c \".\"\u7b26\u53f7\u7528\u4e8e\u5206\u5272\u914d\u7f6e\u9879\u540d\u79f0\uff0c\u5982\u679cSchemaId\u4e2d\u4e5f\u5305\u542b\u4e86\".\"\u53ef\u80fd\u4f1a\u5bfc\u81f4\u4e00\u4e9b\u652f\u6301\u5951\u7ea6\u7ea7\u522b\u7684\u914d\u7f6e\u65e0\u6cd5\u6b63\u786e\u88ab\u8bc6\u522b\u3002</li> <li>OperationId\u7684\u547d\u540d\u4e2d\u4e0d\u53ef\u5305\u542b\".\"\u5b57\u7b26\u3002</li> </ul>"},{"location":"build-provider/event-listener.html","title":"\u670d\u52a1\u542f\u52a8\u4e8b\u4ef6","text":"<p>java chassis \u542f\u52a8\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u5e7f\u64ad\u4e8b\u4ef6\u3002 \u4e1a\u52a1\u53ef\u4ee5\u5728\u670d\u52a1\u542f\u52a8\u7684\u4e0d\u540c\u9636\u6bb5\u6267\u884c\u4e00\u4e9b\u521d\u59cb\u5316\u903b\u8f91\u3002 \u4e8b\u4ef6\u7c7b\u578b\u5728 <code>BootListener</code> \u91cc\u9762\u5b9a\u4e49\uff1a</p> <pre><code>public interface BootListener {\n enum EventType {\n BEFORE_HANDLER,\n AFTER_HANDLER,\n BEFORE_PRODUCER_PROVIDER,\n AFTER_PRODUCER_PROVIDER,\n BEFORE_CONSUMER_PROVIDER,\n AFTER_CONSUMER_PROVIDER,\n BEFORE_TRANSPORT,\n AFTER_TRANSPORT,\n BEFORE_REGISTRY,\n AFTER_REGISTRY,\n BEFORE_CLOSE,\n AFTER_CLOSE\n }\n}\n</code></pre> <p>\u81ea\u5b9a\u4e49\u4e8b\u4ef6\u5904\u7406\u5668\u53ea\u9700\u8981\u5b9e\u73b0 <code>BootListener</code> \u7684\u63a5\u53e3\uff0c\u5e76\u4e14\u58f0\u660e\u4e3a <code>Component</code> \u5373\u53ef\u3002</p> <pre><code>@Component\npublic class AuthHandlerBoot implements BootListener {\n @Override\n public void onBootEvent(BootEvent event) {\n if (EventType.BEFORE_REGISTRY.equals(event.getEventType())) {\n RSAKeyPairEntry rsaKeyPairEntry = RSAUtils.generateRSAKeyPair();\n RSAKeypair4Auth.INSTANCE.setPrivateKey(rsaKeyPairEntry.getPrivateKey());\n RSAKeypair4Auth.INSTANCE.setPublicKey(rsaKeyPairEntry.getPublicKey());\n RSAKeypair4Auth.INSTANCE.setPublicKeyEncoded(rsaKeyPairEntry.getPublicKeyEncoded());\n RegistryUtils.getMicroserviceInstance().getProperties().put(Const.INSTANCE_PUBKEY_PRO,\n rsaKeyPairEntry.getPublicKeyEncoded());\n }\n }\n}\n</code></pre> <p>\u6bd4\u5982\uff0c\u901a\u8fc7\u4e8b\u4ef6\u5904\u7406\u5668\uff0c\u53ef\u4ee5\u5728\u670d\u52a1\u6ce8\u518c\u5b8c\u6210\u6216\u8005\u670d\u52a1\u6ce8\u518c\u4e4b\u524d\u8fdb\u884c\u4e00\u4e9b\u521d\u59cb\u5316\u64cd\u4f5c\u3002</p>"},{"location":"build-provider/http-mapping.html","title":"HTTP\u53c2\u6570\u6620\u5c04\u53c2\u8003","text":"<p>HTTP\u534f\u8bae\u662f\u4e00\u4e2a\u6587\u672c\u4f20\u8f93\u534f\u8bae\uff0cRESTFul\u6846\u67b6\u6838\u5fc3\u90e8\u5206\uff0c\u5c31\u662f\u5c06\u8bed\u8a00\u5bf9\u8c61\u4e0eHTTP\u534f\u8bae\u7684\u7ec4\u6210\u90e8\u4ef6\u6620\u5c04\u8d77\u6765\uff0c\u63d0\u4f9b\u8fdc\u7a0b\u8fc7\u7a0b\u8c03\u7528(RPC)\u80fd\u529b\u3002 HTTP\u7684\u8bf7\u6c42\u54cd\u5e94\u53ef\u4ee5\u7b80\u5316\u63cf\u8ff0\u4e3a\uff1a</p> <ul> <li>\u8bf7\u6c42</li> </ul> <pre><code>GET /apps HTTP/1.1\n\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: application/x-www-form-urlencoded\n\nqueryParamExample1=example1&amp;queryParamExample2=example2\n</code></pre> <ul> <li>\u54cd\u5e94</li> </ul> <pre><code>Host: 127.0.0.1:8080\nContent-Type: application/x-www-form-urlencoded\n\nqueryParamExample1=example1&amp;queryParamExample2=example2\n</code></pre>"},{"location":"build-provider/http-mapping.html#http_1","title":"HTTP\u8bf7\u6c42\u53c2\u6570\u6620\u5c04","text":""},{"location":"build-provider/http-mapping.html#query","title":"Query","text":"<p>Query\u53c2\u6570\u5c5e\u4e8eHTTP\u534f\u8baeURL\u7684\u4e00\u90e8\u5206\uff0c\u6bd4\u5982:</p> <pre><code>GET /apps?queryParamExample1=example1&amp;queryParamExample2=example2 HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\n</code></pre> <p>\u5b9a\u4e49\u4e86Query\u53c2\u6570 <code>queryParamExample1</code> \u548c <code>queryParamExample2</code>\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@GetMapping(\"\")\npublic String queryExample(@RequestParam(\"queryParamExample1\") String example1,\n @RequestParam(\"queryParamExample2\") String example2)\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@GET\n@Path(\"\")\npublic String queryJAXRSExample(@QueryParam(\"queryParamExample1\") String example1,\n @QueryParam(\"queryParamExample2\") String example2)\n</code></pre>"},{"location":"build-provider/http-mapping.html#path","title":"Path","text":"<p>Path\u53c2\u6570\u5c5e\u4e8eHTTP\u534f\u8baeURL\u7684\u4e00\u90e8\u5206\uff0c\u6bd4\u5982:</p> <pre><code>GET /apps/pathParamExample1/pathParamExample2 HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\n</code></pre> <p>\u5b9a\u4e49\u4e86Path\u53c2\u6570 <code>pathParamExample1</code> \u548c <code>pathParamExample2</code>\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@GetMapping(\"/{pathParamExample1}/{pathParamExample2}\")\npublic String pathSpringMVCExample(@PathVariable(\"pathParamExample1\") String example1,\n @PathVariable(\"pathParamExample2\") String example2)\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@GET\n@Path(\"/{pathParamExample1}/{pathParamExample2}\")\npublic String pathJAXRSExample(@PathParam(\"pathParamExample1\") String example1,\n @PathParam(\"pathParamExample2\") String example2) \n</code></pre>"},{"location":"build-provider/http-mapping.html#header","title":"Header","text":"<p>Header\u5bf9\u5e94\u4e8eHTTP\u534f\u8bae\u8bf7\u6c42\u5934\uff0c\u6bd4\u5982:</p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nheaderParamExample1: example1\nheaderParamExample2: example2\n</code></pre> <p>\u5b9a\u4e49\u4e86Header\u53c2\u6570 <code>headerParamExample1</code> \u548c <code>headerParamExample2</code>\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@GetMapping(\"\")\npublic String headerSpringMVCExample(@RequestHeader(\"headerParamExample1\") String example1,\n @RequestHeader(\"headerParamExample2\") String example2)\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@GET\n@Path(\"\")\npublic String headerJAXRSExample(@HeaderParam(\"headerParamExample1\") String example1,\n @HeaderParam(\"headerParamExample2\") String example2)\n</code></pre>"},{"location":"build-provider/http-mapping.html#applicationx-www-form-urlencoded","title":"application/x-www-form-urlencoded","text":"<p>\u5f53 HTTP \u6d88\u606f\u4f53\u662f <code>application/x-www-form-urlencoded</code>\uff0c \u53ef\u4ee5\u4f7f\u7528 Form \u53c2\u6570\u3002 </p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: application/x-www-form-urlencoded\n\nqueryParamExample1=example1&amp;queryParamExample2=example2\n</code></pre> <ul> <li>Spring MVC</li> </ul> <pre><code>@GetMapping(path = \"formSpringMVCExample\", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)\npublic String formSpringMVCExample(@RequestAttribute(\"formParamExample1\") String example1,\n @RequestAttribute(\"formParamExample2\") String example2)\n</code></pre> <p>\u539f\u751f Spring MVC \u7684 RequestAttribute \u8868\u793a HTTP \u7684 Attribute\uff0c \u4f7f\u7528 RequestParam \u8868\u793a form \u53c2\u6570\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u4ee3\u7801\u751f\u6210\u5951\u7ea6\u7684\u65f6\u5019\u4ea7\u751f\u6b67\u4e49\u3002 Java Chassis 3 \u63a8\u8350\u4f7f\u7528 RequestAttribute \u8868\u793aForm\u53c2\u6570\u3002</p> <ul> <li>JAX-RS</li> </ul> <pre><code>@GET\n@Path(\"formJAXRSExample\")\n@Consumes(MediaType.APPLICATION_FORM_URLENCODED)\npublic String formJAXRSExample(@FormParam(\"formParamExample1\") String example1,\n @FormParam(\"formParamExample2\") String example2)\n</code></pre>"},{"location":"build-provider/http-mapping.html#applicationjson","title":"application/json","text":"<p>\u5f53 HTTP \u6d88\u606f\u4f53\u662f <code>application/json</code>\uff0c \u4f7f\u7528json\u8fdb\u884c\u5bf9\u8c61\u5e8f\u5217\u5316\u3002</p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: application/json\n\n{\"name\": \"wang\", \"age\": 20}\n</code></pre> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"jsonSpringMVCExample\", consumes = MediaType.APPLICATION_JSON_VALUE)\npublic String jsonSpringMVCExample(@RequestBody Person person) \n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"jsonJAXRSExample\")\n@Consumes(jakarta.ws.rs.core.MediaType.APPLICATION_JSON)\npublic String jsonJAXRSExample(Person person)\n</code></pre> <p>JAX-RS\u6ca1\u6709\u58f0\u660e\u6807\u7b7e\u7684\u65f6\u5019\u8868\u793aBody\u53c2\u6570\u3002 </p>"},{"location":"build-provider/http-mapping.html#applicationprotobuf","title":"application/protobuf","text":"<p>\u5f53 HTTP \u6d88\u606f\u4f53\u662f <code>application/protobuf</code>\uff0c \u4f7f\u7528protobuf\u8fdb\u884c\u5bf9\u8c61\u5e8f\u5217\u5316\u3002</p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: application/protobuf\n\nproto-buffer-binary-data\n</code></pre> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"protobufSpringMVCExample\", consumes = SwaggerConst.PROTOBUF_TYPE)\npublic String protobufSpringMVCExample(@RequestBody Person person)\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"protobufJAXRSExample\")\n@Consumes(SwaggerConst.PROTOBUF_TYPE)\npublic String protobufJAXRSExample(Person person)\n</code></pre> <p>JAX-RS\u6ca1\u6709\u58f0\u660e\u6807\u7b7e\u7684\u65f6\u5019\u8868\u793aBody\u53c2\u6570\u3002</p>"},{"location":"build-provider/http-mapping.html#applicationtext","title":"application/text","text":"<p>\u5f53 HTTP \u6d88\u606f\u4f53\u662f <code>application/text</code>\uff0c \u4f7f\u7528json\u8fdb\u884c\u5bf9\u8c61\u5e8f\u5217\u5316\u3002</p> <p>application/text \u548c application/json \u5728\u5bf9\u8c61\u5e8f\u5217\u5316\u4e0a\u90fd\u91c7\u7528 json\uff0c\u5bf9\u4e8e\u5927\u591a\u6570\u573a\u666f\u4e24\u8005\u662f\u7b49\u4ef7\u7684\u3002\u53ea\u6709\u5f53\u5bf9\u8c61\u7c7b\u578b\u4e3a String \u7684\u65f6\u5019\uff0c \u5b58\u5728\u5dee\u5f02\uff1aapplication/text \u7684 String \u5e8f\u5217\u5316\u540e\u7684\u6587\u672c\u6ca1\u6709\u53cc\u5f15\u53f7\uff1bapplication/json \u7684 String \u5e8f\u5217\u5316\u540e\u7684\u6587\u672c\u6709\u53cc\u5f15\u53f7\uff1b</p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: application/text\n\n{\"name\": \"wang\", \"age\": 20}\n</code></pre> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"textSpringMVCExample\", consumes = MediaType.TEXT_PLAIN_VALUE)\npublic String textSpringMVCExample(@RequestBody Person person)\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"textJAXRSExample\")\n@Consumes(MediaType.TEXT_PLAIN)\npublic String textJAXRSExample(Person person) \n</code></pre> <p>JAX-RS\u6ca1\u6709\u58f0\u660e\u6807\u7b7e\u7684\u65f6\u5019\u8868\u793aBody\u53c2\u6570\u3002</p>"},{"location":"build-provider/http-mapping.html#multipartform-data","title":"\u6587\u4ef6\u4e0a\u4f20\uff1amultipart/form-data","text":"<p>\u5f53 HTTP \u6d88\u606f\u4f53\u662f <code>multipart/form-data</code>\uff0c \u8868\u793a\u6587\u4ef6\u4e0a\u4f20\u3002</p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: multipart/form-data; boundary=----boundary-example----\n\n----boundary-example----\nContent-Disposition: form-data; name=\"multiPartParamExample1\"\n\ncontents of multiPartParamExample1\n----boundary-example----\nContent-Disposition: form-data; name=\"multiPartParamExample2\"\n\ncontents of multiPartParamExample2\n----boundary-example----\n</code></pre> <p>multipart/form-data \u4e5f\u53ef\u4ee5\u8868\u793a Form \u53c2\u6570\uff0c \u548c application/x-www-form-urlencoded \u7528\u6cd5\u4e00\u6837\u3002\u4e3a\u4e86\u907f\u514d\u6df7\u6dc6\u548c\u7b80\u6d01\uff0c\u5efa\u8baemultipart/form-data\u4e13\u7528\u4e8e\u6587\u4ef6\u4e0a\u4f20\u573a\u666f\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"multiPartSpringMVCExample\", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)\npublic String multiPartSpringMVCExample(@RequestPart(\"multiPartParamExample1\") MultipartFile example1,\n @RequestPart(\"multiPartParamExample2\") MultipartFile example2)\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"multiPartJAXRSExample\")\n@Consumes(MediaType.MULTIPART_FORM_DATA)\npublic String multiPartJAXRSExample(@FormParam(\"multiPartParamExample1\") Part example1,\n @FormParam(\"multiPartParamExample2\") Part example2)\n</code></pre>"},{"location":"build-provider/http-mapping.html#http_2","title":"HTTP\u54cd\u5e94\u53c2\u6570\u6620\u5c04","text":""},{"location":"build-provider/http-mapping.html#header_1","title":"\u72b6\u6001\u7801 \u548c Header","text":"<p>\u5728\u6ca1\u6709\u7279\u6b8a\u58f0\u660e\u7684\u60c5\u51b5\u4e0b\uff0c\u6b63\u5e38\u54cd\u5e94\u7684\u72b6\u6001\u7801\u662f <code>200</code>\uff0c\u4e5f\u53ef\u4ee5\u58f0\u660e\u5176\u4ed6\u72b6\u6001\u7801\u3002</p> <p>Java Chassis 2xx \u72b6\u6001\u7801\u8868\u793a\u6b63\u5e38\u54cd\u5e94\uff0c\u4f1a\u8fdb\u884c\u5bf9\u8c61\u5e8f\u5217\u5316\u3002 \u53ef\u4ee5\u4f7f\u7528 <code>@ApiResponse</code> \u81ea\u5b9a\u4e49\u72b6\u6001\u7801\uff0c\u6240\u6709 2xx \u72b6\u6001\u7801\u58f0\u660e\u7684\u5bf9\u8c61\u7c7b\u578b\u5fc5\u987b\u4e00\u6837\u3002 \u5176\u4ed6\u72b6\u6001\u7801\u8868\u793a\u5f02\u5e38\uff0c\u4f1a\u5bf9 <code>InvocationException</code> \u8fdb\u884c\u5e8f\u5217\u5316\uff0c\u4e0d\u8981\u6c42\u5bf9\u8c61\u7c7b\u578b\u4e00\u6837\u3002 </p> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"statusHeaderSpringMVCExample\")\n@ApiResponses(value = {\n @ApiResponse(\n responseCode = \"200\",\n content = @Content(schema = @Schema(implementation = Person.class)),\n headers = {\n @Header(name = \"h1\", schema = @Schema(implementation = String.class)),\n @Header(name = \"h2\", schema = @Schema(implementation = String.class))}),\n @ApiResponse(\n responseCode = \"202\",\n content = @Content(schema = @Schema(implementation = Person.class)),\n headers = {\n @Header(name = \"h1\", schema = @Schema(implementation = String.class)),\n @Header(name = \"h2\", schema = @Schema(implementation = String.class))}),\n @ApiResponse(\n responseCode = \"400\",\n content = @Content(schema = @Schema(implementation = MultiResponse400.class)),\n headers = {\n @Header(name = \"h1\", schema = @Schema(implementation = String.class)),\n @Header(name = \"h2\", schema = @Schema(implementation = String.class))})})\npublic ResponseEntity&lt;Person&gt; statusHeaderSpringMVCExample(@RequestBody Person person) {\n return ResponseEntity.status(200).header(\"h1\", \"h1\")\n .header(\"h2\", \"h2\").body(person);\n}\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@PostMapping(path = \"statusHeaderJAXRSExample\")\n@ApiResponses(value = {\n @ApiResponse(\n responseCode = \"200\",\n content = @Content(schema = @Schema(implementation = Person.class)),\n headers = {\n @Header(name = \"h1\", schema = @Schema(implementation = String.class)),\n @Header(name = \"h2\", schema = @Schema(implementation = String.class))}),\n @ApiResponse(\n responseCode = \"202\",\n content = @Content(schema = @Schema(implementation = Person.class)),\n headers = {\n @Header(name = \"h1\", schema = @Schema(implementation = String.class)),\n @Header(name = \"h2\", schema = @Schema(implementation = String.class))}),\n @ApiResponse(\n responseCode = \"400\",\n content = @Content(schema = @Schema(implementation = MultiResponse400.class)),\n headers = {\n @Header(name = \"h1\", schema = @Schema(implementation = String.class)),\n @Header(name = \"h2\", schema = @Schema(implementation = String.class))})})\npublic Response statusHeaderJAXRSExample(@RequestBody Person person) {\n return Response.status(200).entity(new Person()).header(\"h1\", \"h1\")\n .header(\"h2\", \"h2\").build();\n}\n</code></pre>"},{"location":"build-provider/http-mapping.html#applicationjson_1","title":"application/json","text":"<p>\u54cd\u5e94\u7c7b\u578b\u6839\u636e <code>Accept</code> \u6765\u786e\u5b9a\uff0c\u9ed8\u8ba4\u662f application/json\u3002 \u4e5f\u53ef\u4ee5\u58f0\u660e\u63a5\u53e3\u53ea\u652f\u6301 application/json \u54cd\u5e94\u3002 </p> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"produceJsonSpringMVCExample\", produces = MediaType.APPLICATION_JSON_VALUE)\npublic Person produceJsonSpringMVCExample()\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"produceJsonJAXRSExample\")\n@Produces(MediaType.APPLICATION_JSON)\npublic Person produceJsonJAXRSExample() \n</code></pre>"},{"location":"build-provider/http-mapping.html#applicationprotobuf_1","title":"application/protobuf","text":"<p>\u54cd\u5e94\u7c7b\u578b\u6839\u636e <code>Accept</code> \u6765\u786e\u5b9a\uff0c\u9ed8\u8ba4\u662f application/json\u3002 \u4e5f\u53ef\u4ee5\u58f0\u660e\u63a5\u53e3\u53ea\u652f\u6301 application/protobuf \u54cd\u5e94\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"produceProtobufSpringMVCExample\", produces = SwaggerConst.PROTOBUF_TYPE)\npublic Person produceProtobufSpringMVCExample()\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"produceProtobufJAXRSExample\")\n@Produces(SwaggerConst.PROTOBUF_TYPE)\npublic Person produceProtobufJAXRSExample() \n</code></pre>"},{"location":"build-provider/http-mapping.html#applicationtext_1","title":"application/text","text":"<p>\u54cd\u5e94\u7c7b\u578b\u6839\u636e <code>Accept</code> \u6765\u786e\u5b9a\uff0c\u9ed8\u8ba4\u662f application/json\u3002 \u4e5f\u53ef\u4ee5\u58f0\u660e\u63a5\u53e3\u53ea\u652f\u6301 application/text \u54cd\u5e94\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"produceTextSpringMVCExample\", produces = MediaType.TEXT_PLAIN_VALUE)\npublic Person produceTextSpringMVCExample()\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@POST\n@Path(\"produceTextJAXRSExample\")\n@Produces(MediaType.TEXT_PLAIN)\npublic Person produceTextJAXRSExample() \n</code></pre>"},{"location":"build-provider/http-mapping.html#_1","title":"\u6587\u4ef6\u4e0b\u8f7d","text":"<p>Java Chassis\u63d0\u4f9b\u4e86\u901a\u7528\u7684 <code>\u6587\u4ef6\u4e0b\u8f7d</code> \u652f\u6301\u3002 \u5982\u679c\u8fd4\u56de\u503c\u7c7b\u578b\u4e3a <code>File</code>\u3001<code>Resource</code>\u3001<code>InputStream</code>\u3001<code>Part</code> \u7b49\uff0c\u5219\u88ab\u8ba4\u4e3a\u662f <code>\u6587\u4ef6\u4e0b\u8f7d</code>\u3002 \u6587\u4ef6MIME\u7c7b\u578b\u548c\u6587\u4ef6\u540d\u53ef\u4ee5\u4f7f\u7528 <code>Part</code> \u7684 API \u6307\u5b9a\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@GetMapping(path = \"/downloadSpringMVCExample\")\npublic Part downloadSpringMVCExample(String content) throws IOException {\n File file = createTempFile(content);\n return new FilePart(null, file)\n .setDeleteAfterFinished(true)\n .setSubmittedFileName(\"test.bin\")\n .contentType(\"application/octet-stream\");\n}\n</code></pre> <p>\u4e0a\u8ff0\u63a5\u53e3\u4f1a\u8fd4\u56de\u5982\u4e0b\u54cd\u5e94\u5934:</p> <pre><code>Content-Disposition: attachment;filename=test.bin;filename*=utf-8\u2019\u2019test.bin\nContent-Encoding: gzip\nContent-Type: application/octet-stream\nTransfer-Encoding: chunked\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@GET\n@Path(\"/downloadSpringMVCExample\")\npublic Part downloadSpringMVCExample(String content) throws IOException {\n File file = createTempFile(content);\n return new FilePart(null, file)\n .setDeleteAfterFinished(true)\n .setSubmittedFileName(\"test.bin\")\n .contentType(\"application/octet-stream\");\n}\n</code></pre> <p>\u4e0a\u8ff0\u63a5\u53e3\u4f1a\u8fd4\u56de\u5982\u4e0b\u54cd\u5e94\u5934:</p> <pre><code>Content-Disposition: attachment;filename=test.bin;filename*=utf-8\u2019\u2019test.bin\nContent-Encoding: gzip\nContent-Type: application/octet-stream\nTransfer-Encoding: chunked\n</code></pre>"},{"location":"build-provider/interface-constraints.html","title":"\u63a5\u53e3\u5b9a\u4e49\u548c\u6570\u636e\u7c7b\u578b","text":"<p>\u4e0d\u8bba\u91c7\u7528 <code>JAX-RS</code>\u3001<code>Spring MVC</code>\uff0c\u8fd8\u662f\u91c7\u7528 <code>\u900f\u660eRPC</code> \u5f00\u53d1\uff0c\u90fd\u6d89\u53ca\u63a5\u53e3\u7684\u8fd4\u56de\u503c\u548c\u53c2\u6570\u3002java-chassis \u91c7\u7528\u7684\u662f\u4e00\u79cd\u5e73\u53f0\u65e0\u5173\u7684\u6570\u636e\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u5f53 <code>Transport</code> \u4e3a <code>REST</code> \u7684\u65f6\u5019\uff0c\u5e8f\u5217\u5316\u65b9\u5f0f\u4e3a <code>json</code>\uff0c\u5f53 <code>Transport</code> \u4e3a <code>Highway</code> \u7684\u65f6\u5019\uff0c\u5e8f\u5217\u5316\u65b9\u5f0f\u4e3a <code>protobuffer</code>\u3002 \u5e73\u53f0\u65e0\u5173\u7684\u6570\u636e\u5e8f\u5217\u5316\u65b9\u5f0f\u6709\u4e2a\u57fa\u672c \u7279\u5f81\uff1a\u4f5c\u4e3a <code>Consumer</code>\uff0c \u4ece\u5e8f\u5217\u5316\u7684\u6570\u636e\u4e2d\uff0c\u65e0\u6cd5\u83b7\u53d6\u4efb\u4f55\u548c <code>Consuemr</code> \u5f00\u53d1\u8bed\u8a00\u6709\u5173\u7684\u7c7b\u578b\u4fe1\u606f\u3002 \u5e73\u53f0\u65e0\u5173 \u7279\u6027\u7ed9\u63a5\u53e3\u5b9a\u4e49\u7684\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u4e86\u66f4\u4e25\u683c\u7684\u8981\u6c42\uff0c\u7b26\u5408\u8fd9\u4e9b\u8981\u6c42\u7684\u63a5\u53e3\u5b9a\u4e49\uff0c\u4e00\u65b9\u9762\u8fd0\u884c\u66f4\u52a0\u9ad8\u6548\uff0c\u53e6\u5916\u4e00\u65b9\u9762\u66f4\u52a0\u65b9\u4fbf\u7684 \u52a8\u6001\u8c03\u6574 <code>Transport</code>\uff0c \u800c\u65e0\u9700\u5bf9\u4ee3\u7801\u505a\u51fa\u4fee\u6539\u3002 </p> <p>\u5bf9\u4e8e <code>REST</code>\uff0c \u867d\u7136 <code>json</code> \u672c\u8eab\u4e0d\u5305\u542b\u7279\u5b9a\u5e73\u53f0\u7684\u7c7b\u578b\u4fe1\u606f\uff0c\u4f46\u662f <code>JAVA</code> \u53ef\u4ee5\u901a\u8fc7\u5728\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\uff0c\u6307\u5b9a\u76ee\u6807 \u7c7b\u578b\uff0c\u6240\u4ee5\u5bf9\u4e8e <code>REST</code>\uff0c \u53ef\u4ee5\u66f4\u52a0\u7075\u6d3b\u7684\u4f7f\u7528\u4e0d\u540c\u7684\u7c7b\u578b\u3002 </p> <p>\u672c\u7ae0\u8282\u4e3b\u8981\u4ecb\u7ecd\u4e3a\u4e86\u5b9e\u73b0\u6700\u5927\u7684\u5938\u5e73\u53f0\u548c\u9ad8\u6027\u80fd\uff0c\u5f00\u53d1\u8005\u5b9a\u4e49\u63a5\u53e3\u7684\u6700\u4f73\u5b9e\u8df5\u3002\u540c\u65f6\u4ecb\u7ecd\u5728\u4f7f\u7528 <code>REST</code> \u7684\u60c5\u51b5\u4e0b\uff0c\u5982\u4f55 \u66f4\u52a0\u7075\u6d3b\u7684\u652f\u6301\u4e0d\u540c\u7684\u7c7b\u578b\u3002 </p>"},{"location":"build-provider/interface-constraints.html#_2","title":"\u63a5\u53e3\u5b9a\u4e49\u7684\u6700\u4f73\u5b9e\u8df5\u548c\u7c7b\u578b\u7ea6\u675f","text":"<p>java-chassis \u7684\u6240\u6709\u63a5\u53e3\u5b9a\u4e49\uff0c\u90fd\u53ef\u4ee5\u751f\u6210\u7b26\u5408 <code>OpenAPI</code> \u7684 <code>swagger</code> \u63a5\u53e3\u63cf\u8ff0\uff0c\u5f53\u4f7f\u7528 <code>Highway</code> \u534f\u8bae\u65f6\uff0c <code>swagger</code> \u6587\u4ef6\u8fd8\u4f1a\u5728\u5185\u90e8\u88ab\u8f6c\u6362\u4e3a\u7b49\u4ef7\u7684 <code>proto</code> \u6587\u4ef6\u3002 \u63a5\u53e3\u5b9a\u4e49\u7684\u6700\u4f73\u5b9e\u8df5\u9700\u8981\u6ee1\u8db3 <code>OpenAPI</code> \u548c <code>proto</code>\u7684 \u6570\u636e\u7c7b\u578b\u8981\u6c42\u3002 </p> <ul> <li><code>OpenAPI</code> \u5b9a\u4e49\u4e86\u5982\u4e0b\u4e00\u4e9b\u57fa\u672c\u7c7b\u578b\uff1a</li> </ul> <p>\u4e0b\u9762\u5217\u4e3e\u4e00\u4e9b\u5e38\u89c1\u7684\u7c7b\u578b\u8bf4\u660e\uff0c\u8be6\u7ec6\u53c2\u8003 OpenAPI\u6587\u6863\u3002</p> type format java \u8bf4\u660e string - String string date java.util.Date, java.time.LocalDate \u63a8\u8350\u4f7f\u7528 LocalDate string date-time java.util.Date, java.time.LocalDateTime \u63a8\u8350\u4f7f\u7528 LocalDateTime number - double number float float number double double integer - integer integer int32 int integer int64 long boolean - boolean array ArrayList \u5fc5\u987b\u6307\u5b9a\u7c7b\u578b object \u7531\u4e0a\u9762\u7684\u5c5e\u6027\u6784\u6210\u7684\u5bf9\u8c61\u7c7b\u578b\u3002\u5305\u62ec\u5b57\u5178\uff08HashMap\uff09\uff0c\u5b57\u5178\u7684 key \u5fc5\u987b\u4e3a string \u53c2\u6570\u7c7b\u578b \u901a\u4fe1\u534f\u8bae \u7f16\u7801\u65b9\u5f0f \u662f\u5426\u652f\u6301 \u5907\u6ce8 Query HTTP/HTTP2 TEXT \u662f \u652f\u6301string, number, boolean, array Path HTTP/HTTP2 TEXT \u662f \u652f\u6301string, number, boolean Header HTTP/HTTP2 TEXT \u662f \u652f\u6301string, number, boolean Cookie HTTP/HTTP2 TEXT \u662f \u652f\u6301string, number, boolean Body HTTP/HTTP2 application/x-www-form-urlencoded \u662f \u652f\u6301string, number, boolean Body HTTP/HTTP2 multipart/form-data \u662f \u652f\u6301string, number, boolean Body HTTP/HTTP2 application/json \u662f Body HTTP/HTTP2 application/protobuf \u662f Query HIGHWAY TEXT \u662f \u652f\u6301string, number, boolean, array Path HIGHWAY TEXT \u662f \u652f\u6301string, number, boolean Header HIGHWAY TEXT \u662f \u652f\u6301string, number, boolean Cookie HIGHWAY TEXT \u662f \u652f\u6301string, number, boolean Body HIGHWAY application/x-www-form-urlencoded \u5426 Body HIGHWAY multipart/form-data \u5426 Body HIGHWAY application/json \u662f Body HIGHWAY application/protobuf \u662f <ul> <li><code>proto</code> \u5b9a\u4e49\u4e86\u5982\u4e0b\u4e00\u4e9b\u57fa\u672c\u7c7b\u578b\uff1a</li> </ul> <p>\u4e0b\u9762\u5217\u4e3e\u4e00\u4e9b\u5e38\u89c1\u7684\u7c7b\u578b\u8bf4\u660e\uff0c\u8be6\u7ec6\u53c2\u8003 Proto Buffer\u7c7b\u578b\u8bf4\u660e\u3002</p> type java \u8bf4\u660e double double float float int32 int int64 long uint32 int uint64 long sint32 int sint64 long fixed32 int fixed64 long sfixed32 int sfixed64 long bool boolean string String bytes ByteString map \u5b57\u5178\u7c7b\u578b <p><code>OpenAPI</code> \u7684 <code>date</code> format \u5728 <code>proto</code> \u91cc\u9762\u91c7\u7528 <code>long</code> \u8868\u793a\u3002 java-chassis \u7684\u5f00\u53d1\u5b9e\u8df5\u5206\u4e3a <code>code first</code> \u548c <code>contrast first</code> \u4e24\u79cd\u6a21\u5f0f\uff0c \u5982\u679c\u91c7\u7528 <code>contrast first</code> \u6a21\u5f0f\uff0c\u5148\u5199 <code>swagger</code>\uff0c \u7136\u540e\u901a\u8fc7 <code>swagger</code> \u751f\u6210 \u4ee3\u7801\uff0c \u8fd9\u79cd\u65b9\u5f0f\u751f\u6210\u7684\u6570\u636e\u7c7b\u578b\u90fd\u662f\u7b26\u5408\u6700\u4f73\u5b9e\u8df5\u7684\u3002 \u5982\u679c\u91c7\u7528 <code>code first</code>\uff0c \u8981\u8003\u8651\u54ea\u4e9b\u7c7b\u578b\u662f\u6700\u4f73\u5b9e\u8df5\uff0c\u53ef\u4ee5\u4ece\u601d\u8003\u5b9a\u4e49 \u7684 JAVA \u7c7b\u578b\uff0c\u5bf9\u5e94\u7684 <code>swagger</code> \u662f\u4ec0\u4e48\u6837\u5b50\u7684\u3002 \u5f53\u7136\u8fd9\u6837\u601d\u8003\uff0c\u5bf9\u4e8e\u4e0d\u719f\u6089 <code>swagger</code> \u6216\u8005 <code>proto</code> \u7684\u5f00\u53d1\u8005 \u8fd8\u662f\u663e\u5f97\u590d\u6742\u3002 \u4e0b\u9762\u4ece <code>code first</code> \u7684\u89d2\u5ea6\u63cf\u8ff0\u4f7f\u7528\u54ea\u4e9b\u7c7b\u578b\u662f\u6700\u4f73\u5b9e\u8df5\u3002 </p>"},{"location":"build-provider/interface-constraints.html#code-first","title":"\u4ece <code>code first</code> \u89d2\u5ea6\u7406\u89e3\u5938\u5e73\u53f0\u6570\u636e\u7c7b\u578b\u7684\u7ea6\u675f","text":"<p>\u5f00\u53d1\u8005\u4e0d\u80fd\u5728\u63a5\u53e3\u5b9a\u4e49\u7684\u65f6\u5019\u4f7f\u7528\u5982\u4e0b\u7c7b\u578b\uff1a</p> <ul> <li> <p>\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784: java.lang.Object, net.sf.json.JsonObject \u7b49\u3002 \u4f7f\u7528\u8fd9\u4e9b\u7c7b\u578b java-chassis \u542f\u52a8 \u4e0d\u4f1a\u62a5\u9519\uff0c\u529f\u80fd\u4e5f\u662f\u6b63\u5e38\u7684\u3002\u4f46\u4e0d\u662f\u6700\u4f73\u5b9e\u8df5\uff0c\u4e5f\u4f1a\u5bf9\u6027\u80fd\u6709\u4e00\u5b9a\u5f71\u54cd\u3002 </p> </li> <li> <p>\u63a5\u53e3\u6216\u8005\u62bd\u8c61\u7c7b</p> <pre><code>```java\npublic interface IPerson {//...}\npublic abstract class AbstractPerson {//...}\n```\n</code></pre> </li> <li> <p>\u4e0a\u8ff0\u7c7b\u578b\u7684\u96c6\u5408\u7c7b\u578b\u6216\u8005\u6ca1\u6709\u6307\u5b9a\u5177\u4f53\u7c7b\u578b\u7684\u96c6\u5408\uff0c\u6bd4\u5982\uff1a<code>List&lt;IPerson&gt;, Map&lt;String, PersonHolder&lt;?&gt;&gt;, List, Map</code>\u7b49\u3002 <code>List&lt;String&gt;, List&lt;Person&gt;</code> \u8fd9\u4e9b\u5177\u4f53\u7c7b\u578b\u662f\u652f\u6301\u7684\u3002</p> </li> <li> <p>\u5305\u542b\u4e0a\u8ff0\u7c7b\u578b\u4f5c\u4e3a\u5c5e\u6027\u7684\u7c7b\u578b</p> <pre><code>```java\npublic class GroupOfPerson {IPerson master //...}\n```\n</code></pre> </li> </ul> <p>\u4e0d\u7528\u62c5\u5fc3\u8bb0\u4e0d\u4f4f\u8fd9\u4e9b\u7ea6\u675f\uff0c\u7a0b\u5e8f\u4f1a\u5728\u542f\u52a8\u7684\u65f6\u5019\u68c0\u67e5\u4e0d\u652f\u6301\u7684\u7c7b\u578b\uff0c\u5e76\u7ed9\u4e0e\u9519\u8bef\u63d0\u793a\u3002</p> <p>\u603b\u4e4b\uff0c\u6570\u636e\u7ed3\u6784\u9700\u8981\u80fd\u591f\u4f7f\u7528\u7b80\u5355\u7684\u6570\u636e\u7c7b\u578b\u8fdb\u884c\u63cf\u8ff0\uff0c\u4e00\u76ee\u4e86\u7136\u5c31\u662f\u6700\u597d\u7684\u3002\u8fd9\u4e2a\u5728\u4e0d\u540c\u7684\u8bed\u8a00\uff0c\u4e0d\u540c\u7684\u534f\u8bae\u91cc\u9762\u90fd\u652f\u6301\u7684\u5f88 \u597d\uff0c\u957f\u671f\u6765\u770b\uff0c\u53ef\u4ee5\u5927\u5927\u51cf\u5c11\u5f00\u53d1\u8005\u8054\u8c03\u6c9f\u901a\u548c\u540e\u671f\u91cd\u6784\u7684\u6210\u672c\u3002</p>"},{"location":"build-provider/interface-constraints.html#_3","title":"\u5173\u4e8e\u6570\u636e\u7ed3\u6784\u548c\u63a5\u53e3\u53d8\u66f4","text":"<p>\u63a5\u53e3\u540d\u79f0\u3001\u53c2\u6570\u7c7b\u578b\u3001\u53c2\u6570\u987a\u5e8f\u3001\u8fd4\u56de\u503c\u7c7b\u578b\u53d8\u66f4\u90fd\u5c5e\u4e8e\u63a5\u53e3\u53d8\u66f4\u3002ServiceComb\u542f\u52a8\u7684\u65f6\u5019\uff0c\u4f1a\u6839\u636e\u7248\u672c\u53f7\u68c0\u6d4b\u63a5\u53e3\u53d8\u5316\uff0c \u63a5\u53e3\u53d8\u5316\u8981\u6c42\u4fee\u6539\u7248\u672c\u53f7\u3002ServiceComb\u8bc6\u522b\u63a5\u53e3\u662f\u5426\u53d8\u5316\u662f\u901a\u8fc7\u4ee3\u7801\u751f\u6210\u7684\u5951\u7ea6\u5185\u5bb9\uff0c\u6709\u4e9b\u4e0d\u89c4\u8303\u7684\u63a5\u53e3\u5b9a\u4e49\u53ef\u80fd\u5bfc\u81f4\u5728 \u4ee3\u7801\u6ca1\u6709\u53d8\u5316\u7684\u60c5\u51b5\u4e0b\uff0c\u751f\u6210\u7684\u5951\u7ea6\u4e0d\u540c\u3002\u6bd4\u5982\uff1a</p> <pre><code>public void get(Person p)\nclass Person {\n private String value;\n private boolean isOk;\n public String getName() {return value}\n public boolean isOk() {return isOK}\n}\n</code></pre> <p>\u8fd9\u4e2a\u63a5\u53e3\u901a\u8fc7access method\u5b9a\u4e49\u4e86\"name\"\u548c\"ok\"\u4e24\u4e2a\u5c5e\u6027\uff0c\u548c\u5b9e\u9645\u7684\u5b57\u6bb5\"value\"\u548c\"isOk\"\u4e0d\u540c\u3002\u8fd9\u79cd\u60c5\u51b5\u53ef\u80fd\u5bfc \u81f4\u6bcf\u6b21\u542f\u52a8\u751f\u6210\u7684\u5951\u7ea6\u4e0d\u4e00\u6837\u3002\u9700\u8981\u5c06\u4ee3\u7801\u8c03\u6574\u4e3a\u7b26\u5408JAVA Bean\u89c4\u8303\u7684\u5b9a\u4e49\u3002</p> <pre><code>public void get(Person p)\nclass Person {\n private String name;\n private boolean ok;\n public String getName() {return name}\n public boolean isOk() {return ok}\n}\n</code></pre> <p>\u6216\u8005\u901a\u8fc7JSON\u6807\u6ce8\uff0c\u663e\u793a\u7684\u6307\u660e\u5b57\u6bb5\u987a\u5e8f\u3002\u6bd4\u5982\uff1a</p> <pre><code>public void get(Person p)\n@JsonPropertyOrder({\"name\", \"ok\"})\nclass Person {\n private String value;\n private boolean isOk;\n public String getName() {return value}\n public boolean isOk() {return isOK}\n}\n</code></pre> <p>\u8003\u8651\u5230\u63a5\u53e3\u53d8\u66f4\u7684\u5f71\u54cd\uff0c\u5efa\u8bae\u5728\u8fdb\u884c\u5bf9\u5916\u63a5\u53e3\u5b9a\u4e49\u7684\u65f6\u5019\uff0c\u5c3d\u53ef\u80fd\u4e0d\u8981\u4f7f\u7528\u7b2c\u4e09\u65b9\u8f6f\u4ef6\u63d0\u4f9b\u7684\u7c7b\u4f5c\u4e3a\u63a5\u53e3\u53c2\u6570\uff0c\u800c\u662f\u4f7f \u7528\u81ea\u5b9a\u4e49\u7684POJO\u7c7b\u3002\u4e00\u65b9\u9762\u5347\u7ea7\u4e09\u65b9\u4ef6\u7684\u65f6\u5019\uff0c\u53ef\u80fd\u611f\u77e5\u4e0d\u5230\u63a5\u53e3\u53d8\u5316\uff1b\u53e6\u5916\u4e00\u65b9\u9762\uff0c\u5982\u679c\u51fa\u73b0\u95ee\u9898\uff0c\u65e0\u6cd5\u901a\u8fc7 \u4fee\u6539\u7b2c\u4e09\u65b9\u4ee3\u7801\u8fdb\u884c\u89c4\u907f\u3002\u6bd4\u5982\uff1ajava.lang.Timestamp, org.joda.time.JodaTime\u7b49\u3002</p>"},{"location":"build-provider/interface-constraints.html#_4","title":"\u534f\u8bae\u4e0a\u7684\u5dee\u5f02","text":"<p>\u5c3d\u7ba1 ServiceComb-Java-Chassis \u5b9e\u73b0\u4e86\u4e0d\u540c\u534f\u8bae\u4e4b\u95f4\u5f00\u53d1\u65b9\u5f0f\u7684\u900f\u660e\uff0c\u53d7\u9650\u4e8e\u5e95\u5c42\u534f\u8bae\u7684\u9650\u5236\uff0c\u4e0d\u540c\u7684\u534f\u8bae\u5b58\u5728\u5c11\u91cf\u5dee\u5f02\u3002</p> <ul> <li> <p>map\uff0ckey\u53ea\u652f\u6301 string</p> </li> <li> <p>highway (protobuf\u9650\u5236) </p> <ol> <li>\u4e0d\u652f\u6301\u5728\u7f51\u7edc\u4e0a\u4f20\u9012null\uff0c\u5305\u62ecCollection\u3001array\u4e2d\u7684\u5143\u7d20\uff0cmap\u7684value </li> <li>\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4\u3001list\uff0c\u4e0d\u4f1a\u5728\u7f51\u7edc\u4e0a\u4f20\u9012\uff0c\u63a5\u6536\u7aef\u89e3\u7801\u51fa\u6765\u5c31\u662f\u9ed8\u8ba4\u503c</li> </ol> </li> <li> <p>springmvc </p> <ol> <li>\u4e0d\u652f\u6301 Date \u4f5c\u4e3a path\u3001query \u53c2\u6570\u3002 \u56e0\u4e3aspringmvc \u76f4\u63a5\u5c06 Date \u505a toString \u653e\u5728path\u3001query\u4e2d\uff0c\u4e0e swagger\u7684\u6807\u51c6\u4e0d\u5339\u914d\u3002</li> </ol> </li> </ul>"},{"location":"build-provider/interface-constraints.html#_5","title":"\u6cdb\u578b\u652f\u6301","text":"<p>ServiceComb-Java-Chassis \u652f\u6301REST\u4f20\u8f93\u65b9\u5f0f\u4e0b\u7684\u6cdb\u578b\u8bf7\u6c42\u53c2\u6570\u548c\u8fd4\u56de\u503c\u3002\u4f8b\u5982\u4f7f\u7528\u4e00\u4e2a\u6cdb\u578b\u7684\u6570\u636e\u7c7b\u578b:</p> <pre><code>public class Generic&lt;T&gt;{\n public T value;\n}\n</code></pre> <p>\u5176\u4e2d\u7684\u6cdb\u578b\u5c5e\u6027T\u53ef\u4ee5\u662f\u4e00\u4e2a\u5b9e\u4f53\u7c7b\u3001java.util.Date\u3001\u679a\u4e3e\uff0c\u4e5f\u53ef\u4ee5\u5d4c\u5957\u6cdb\u578b\u6570\u636e\u7c7b\u578b\u3002</p> <p>\u5f53\u7528\u6237\u4f7f\u7528\u9690\u5f0f\u5951\u7ea6\u529f\u80fd\u81ea\u52a8\u751f\u6210\u5fae\u670d\u52a1\u5951\u7ea6\u65f6\uff0c\u9700\u8981\u5728provider\u63a5\u53e3\u65b9\u6cd5\u7684\u8fd4\u56de\u6d88\u606f\u4e2d\u660e\u786e\u6307\u5b9a\u6cdb\u578b\u7c7b\u578b\uff0c\u4ee5\u4fdd \u8bc1 ServiceComb-Java-Chassis \u751f\u6210\u7684\u5951\u7ea6\u4e2d\u5305\u542b\u8db3\u591f\u7684\u63a5\u53e3\u4fe1\u606f\u3002\u4f8b\u5982\uff0c\u5f53provider\u7aef\u63a5\u53e3\u65b9\u6cd5\u4ee3\u7801\u4e3a</p> <pre><code>public Holder&lt;List&lt;Person&gt;&gt; getHolderListArea() {\n Holder&lt;List&lt;Person&gt;&gt; response = new Holder&lt;&gt;();\n // ommited\n return response;\n}\n</code></pre> <p>\u65f6\uff0c ServiceComb-Java-Chassis \u80fd\u591f\u8bc6\u522b\u51fa\u6cdb\u578b\u8fd4\u56de\u5bf9\u8c61\u7684\u786e\u5207\u4fe1\u606f\uff0c\u4ee5\u4fdd\u8bc1consumer\u7aef\u63a5\u6536\u5230\u7684\u5e94\u7b54\u6d88\u606f\u80fd\u591f\u88ab \u6b63\u786e\u5730\u53cd\u5e8f\u5217\u5316\u3002\u800c\u5982\u679cprovider\u7aef\u63a5\u53e3\u65b9\u6cd5\u7684\u4ee3\u7801\u4e3a</p> <pre><code>public Holder getHolderListArea() {\n Holder&lt;List&lt;Person&gt;&gt; response = new Holder&lt;&gt;();\n // ommited\n return response;\n}\n</code></pre> <p>\u65f6\uff0c\u7531\u4e8e\u5951\u7ea6\u4e2d\u7f3a\u5c11List\u5143\u7d20\u7684\u7c7b\u578b\u4fe1\u606f\uff0c\u5c31\u4f1a\u51fa\u73b0consumer\u7aef\u65e0\u6cd5\u6b63\u786e\u53cd\u5e8f\u5217\u5316\u5e94\u7b54\u7684\u60c5\u51b5\uff0c\u6bd4\u5982consumer\u63a5\u6536 \u5230\u7684\u53c2\u6570\u7c7b\u578b\u53ef\u80fd\u4f1a\u53d8\u4e3a<code>Holder&lt;List&lt;Map&lt;String,String&gt;&gt;&gt;</code>\uff0c<code>Person</code>\u5bf9\u8c61\u9000\u5316\u4e3aMap\u7c7b\u578b\u3002</p> <p>\u8bf4\u660e: \u867d\u7136 ServiceComb-Java-Chassis \u652f\u6301REST\u6cdb\u578b\u53c2\u6570\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u52a0\u63a8\u8350\u7528\u6237\u4f7f\u7528\u5b9e\u4f53\u7c7b\u4f5c\u4e3a\u53c2\u6570\uff0c\u4ee5\u83b7\u5f97 \u66f4\u52a0\u660e\u786e\u7684\u63a5\u53e3\u8bed\u4e49\u3002</p>"},{"location":"build-provider/interface-constraints.html#_6","title":"\u5176\u4ed6\u5e38\u89c1\u95ee\u9898","text":"<ul> <li>\u4f7f\u7528 RestTemplate \u4f20\u9012 raw json</li> </ul> <p>\u5047\u8bbe\u670d\u52a1\u7aef\u5b9a\u4e49\u4e86\u63a5\u53e3</p> <pre><code>Person test(Person input)\n</code></pre> <p>\u7528\u6237\u671f\u671b\u4f7f\u7528RestTemplate\u81ea\u884c\u62fc\u63a5json\u5b57\u7b26\u4e32\uff0c\u7136\u540e\u8fdb\u884c\u4f20\u9012:</p> <pre><code> String personStr = JsonUtils.writeValueAsString(input);\n result = template.postForObject(cseUrlPrefix + \"sayhello\", personStr, Person.class);\n</code></pre> <p>ServiceComb\u4e0d\u63a8\u8350\u5f00\u53d1\u8005\u8fd9\u6837\u4f7f\u7528\uff0c\u91cc\u9762\u7684\u5904\u7406\u903b\u8f91\u5b58\u5728\u5927\u91cf\u6b67\u4e49\u3002\u5982\u679c\u5fc5\u987b\u4f7f\u7528\uff0c\u9700\u8981\u6ee1\u8db3\u51e0\u4e2a\u7ea6\u675f\uff1aPerson \u5fc5\u987b\u5305\u542b\u5e26String\u7c7b\u578b\u7684\u6784\u9020\u51fd\u6570\uff1bprovider/consumer\u90fd\u5fc5\u987b\u5b58\u5728\u8fd9\u4e2aPerson\u7c7b\u578b\u3002</p>"},{"location":"build-provider/interface-constraints.html#rest","title":"<code>REST</code> \u901a\u4fe1\u7c7b\u578b\u6269\u5c55","text":"<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c \u5982\u679c\u5728\u63a5\u53e3\u4e2d\u4f7f\u7528 <code>interface</code> \u6216\u8005 <code>abstract class</code> \u4f5c\u4e3a\u53c2\u6570\u6216\u8005\u8fd4\u56de\u503c\uff0c java-chassis \u542f\u52a8\u4f1a\u62a5\u544a\u9519\u8bef\u3002 java-chassis \u63d0\u4f9b\u4e86\u7c7b\u578b\u6269\u5c55\u673a\u5236\uff0c \u4f7f\u5f97\u7a0b\u5e8f\u4e2d\u53ef\u4ee5\u652f\u6301\u5404\u79cd\u7c7b\u578b\u3002 </p> <p>***\u6ce8\u610f: *** \u4f7f\u7528\u6269\u5c55\u673a\u5236\u7684\u63a5\u53e3\uff0c\u53ea\u80fd\u591f\u5728 <code>REST</code> \u901a\u4fe1\u6a21\u5f0f\u4e0b\u4f7f\u7528\u3002</p> <p>\u4ee5\u652f\u6301 <code>spring-data</code> \u7684 <code>Page</code> \u63a5\u53e3\u4f5c\u4e3a\u8fd4\u56de\u503c\u4e3a\u4f8b\uff0c \u9996\u5148\u9700\u8981\u901a\u8fc7 <code>SPI</code> \u7684\u673a\u5236\u5b9e\u73b0 <code>jackson</code> \u7684\u7c7b\u578b\u6269\u5c55\uff1a</p> <pre><code>public class SpringDataModule extends SimpleModule implements SPIOrder {\n private static final long serialVersionUID = 1L;\n\n @JsonDeserialize(as = PageImpl.class)\n @JsonPropertyOrder(alphabetic = true)\n public static class PageMixin&lt;T&gt; {\n @JsonCreator\n public PageMixin(@JsonProperty(value = \"content\") List&lt;T&gt; content,\n @JsonProperty(\"pageable\") Pageable pageable,\n @JsonProperty(\"total\") long total) {\n }\n }\n\n @JsonDeserialize(as = PageRequest.class)\n @JsonPropertyOrder(alphabetic = true)\n public static class PageableMixin {\n @JsonCreator\n public PageableMixin(@JsonProperty(value = \"pageNumber\") int page,\n @JsonProperty(\"pageSize\") int size, @JsonProperty(value = \"sort\") Sort sort) {\n }\n }\n\n @JsonPropertyOrder(alphabetic = true)\n @JsonDeserialize(as = Sort.class)\n public static class SortMixin {\n // Notice:\n // spring data model changed from version to version\n // for the tested version, sort is not consistency in serialization and deserialization\n @JsonCreator\n public SortMixin(String... properties) {\n }\n }\n\n public SpringDataModule() {\n super(\"springData\");\n\n setMixInAnnotation(Page.class, PageMixin.class);\n setMixInAnnotation(Pageable.class, PageableMixin.class);\n setMixInAnnotation(Sort.class, SortMixin.class);\n\n setMixInAnnotation(PageImpl.class, PageMixin.class);\n setMixInAnnotation(PageRequest.class, PageableMixin.class);\n }\n\n @Override\n public Object getTypeId() {\n return getModuleName();\n }\n\n @Override\n public int getOrder() {\n return Short.MAX_VALUE;\n }\n}\n</code></pre> <p>\u518d\u5b9e\u73b0 <code>SPI</code> \u544a\u8bc9 java-chassis \u8df3\u8fc7\u7c7b\u578b\u68c0\u67e5\uff1a</p> <pre><code>public class SpringDataConcreteTypeRegister implements ConcreteTypeRegister {\n @Override\n public void register(Set&lt;Type&gt; types) {\n types.add(Page.class);\n types.add(Pageable.class);\n }\n}\n</code></pre> <p>\u7ecf\u8fc7\u8fd9\u4e24\u4e2a\u6b65\u9aa4\uff08\u6b65\u9aa4\u4e2d\u6ca1\u63cf\u8ff0\u5f00\u53d1SPI \u9700\u8981\u589e\u52a0 services \u6587\u4ef6\u7684\u5185\u5bb9\uff09\uff0c \u5c31\u80fd\u591f\u5b9e\u73b0\u4efb\u610f\u7c7b\u578b\u7684\u652f\u6301\u3002 \u9700\u8981\u6ce8\u610f\uff0c\u8fd9\u4e9b\u6269\u5c55\uff0c\u5fc5\u987b \u540c\u65f6\u5305\u542b\u5728 <code>Consumer</code>, <code>Provider</code>, <code>edge service</code> \u4e2d\uff0c\u56e0\u4e3a\u8fd9\u79cd\u5904\u7406\u65b9\u5f0f\u662f\u4f9d\u8d56\u4e8e\u5e73\u53f0\u7c7b\u578b\u7684\u975e\u5938\u5e73\u53f0\u7279\u6027\u3002 </p> <p>\u4e0a\u8ff0\u4f8b\u5b50\u7684\u8be6\u7ec6\u4ee3\u7801\u53ef\u4ee5\u53c2\u8003 java-chassis \u7684\u6e90\u4ee3\u7801\uff0c generator-spring-data \u6a21\u5757\u3002 </p>"},{"location":"build-provider/ipv6-configuration.html","title":"IPV6\u914d\u7f6e\u548c\u4f7f\u7528","text":""},{"location":"build-provider/ipv6-configuration.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u968f\u7740IPV6\u7684\u666e\u53ca\uff0c\u5f88\u591a\u573a\u666f\u4e0b\u5fae\u670d\u52a1\u90fd\u9700\u8981\u652f\u6301IPV6\u5730\u5740\uff0c\u7279\u522b\u662f\u7269\u8054\u7f51\u573a\u666f\u4e0b\uff0c\u9700\u8981\u66f4\u591a\u7684\u5730\u5740\u3002ServiceComb\u652f\u6301Ipv6\u5730\u5740\u76d1\u542c\u3001\u6ce8\u518c\u548c\u8c03\u7528\uff0c\u4f7f\u7528\u8d77\u6765\u548c\u9ed8\u8ba4\u7684Ipv4\u51e0\u4e4e\u6ca1\u6709\u5dee\u522b\uff0c\u53ea\u662f\u914d\u7f6e\u7565\u4e0d\u540c\u3002</p>"},{"location":"build-provider/ipv6-configuration.html#_2","title":"\u914d\u7f6e","text":"<ol> <li>\u628a\u76d1\u542c\u5730\u5740\u6539\u6210ipv6 </li> </ol> <pre><code>servicecomb:\n rest:\n address: '[::]:13092'\n</code></pre> <p>\u5982\u679c\u5168\u7f51\u76d1\u542c\uff0cServiceComb JavaChassis 1.2.1\u4ee5\u53ca\u4e4b\u524d\u7684\u7248\u672c\u90fd\u9700\u8981\u518d\u914d\u7f6eservicecomb.service.publishAddress\uff0c\u5426\u5219\u6ce8\u518c\u7684\u8fd8\u662fipv4\u5730\u5740\u3002</p> <p>2\u3001\u4f18\u79c0\u5b9e\u8df5\uff0c\u56e0\u4e3a\u5168\u7f51\u76d1\u542c\u4e0d\u592a\u5b89\u5168\uff0c\u4e00\u822c\u5efa\u8bae\u76d1\u542c\u5230\u5177\u4f53\u5730\u5740\uff0c\u53ef\u4ee5\u4f7f\u7528\u811a\u672c\u7684\u65b9\u5f0f\u83b7\u53d6IPV6\u5730\u5740\uff0c\u7136\u540e\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u7684\u65b9\u5f0f\u914d\u7f6e\u5730\u5740\uff0c\u6bd4\u5982\u5728\u542f\u52a8\u811a\u672c\u4e2d\u4f7f\u7528\u5982\u4e0b\u811a\u672c\u7684\u65b9\u5f0f\u83b7\u53d6\u7f51\u5361ipv6\u5730\u5740\uff0c\u8fd9\u6837\u5c31\u4e0d\u7528\u914d\u7f6eservicecomb.service.publishAddress\uff0c\u4e5f\u4e0d\u4f1a\u6709\u5168\u7f51\u76d1\u542c\u7684\u95ee\u9898\u3002</p> <pre><code>servicecomb:\n rest:\n address: '[${REST_ADDRESS}]:8080'\n</code></pre> <pre><code>#/bin/bash\n\nethname=eth0 #\u9700\u8981\u76d1\u542c\u7684\u7f51\u5361\u540d\uff0c\u4e00\u822c\u90fd\u662feth0\uff0c\u5982\u679c\u662f\u591a\u7f51\u5361\u573a\u666f\u9700\u8981\u4fee\u6539\nexport REST_ADDRESS=`ifconfig $ethname | awk '/inet6 /{print $2}'`\nnohup java -jar yourapp.jar &gt; console.log 2&gt;&amp;1 &amp;\n</code></pre> <p>\u6700\u540e\u53ef\u4ee5\u4f7f\u7528netstat -nltp|grep 8080\u67e5\u770b\u76d1\u542c\u5730\u5740\u662f\u5426\u6b63\u786e\uff0c\u5e76\u4e14\u5230\u670d\u52a1\u4e2d\u5fc3\u68c0\u67e5\u6ce8\u518c\u7684endpoint\u5730\u5740\u662f\u5426\u6b63\u786e\u3002 </p> <p>3\u3001IPV6\u6d4b\u8bd5\uff0c\u786e\u4fddcurl\u652f\u6301ipv6\uff0c\u53ef\u4ee5\u4f7f\u7528curl --help\uff0c\u68c0\u67e5\u662f\u5426\u6709-6\u9009\u9879 curl -v -6 -g --interface eth0 http://[\u5b9e\u9645ipv6\u5730\u5740]:8080/</p>"},{"location":"build-provider/jaxrs.html","title":"\u7528 JAX-RS \u5f00\u53d1\u5fae\u670d\u52a1","text":""},{"location":"build-provider/jaxrs.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>ServiceComb\u652f\u6301\u5f00\u53d1\u8005\u4f7f\u7528JAX-RS\u6ce8\u89e3\uff0c\u4f7f\u7528 JAX-RS \u6a21\u5f0f\u5f00\u53d1\u670d\u52a1\u3002</p>"},{"location":"build-provider/jaxrs.html#_2","title":"\u5f00\u53d1\u793a\u4f8b","text":""},{"location":"build-provider/jaxrs.html#1","title":"\u6b65\u9aa4 1\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3\u3002","text":"<p>\u6839\u636e\u5f00\u53d1\u4e4b\u524d\u5b9a\u4e49\u597d\u7684\u5951\u7ea6\uff0c\u7f16\u5199Java\u4e1a\u52a1\u63a5\u53e3\uff0c\u4ee3\u7801\u5982\u4e0b\u3002\u5b9a\u4e49\u63a5\u53e3\u4e0d\u662f\u5fc5\u987b\u7684\uff0c\u4f46\u662f \u4e00\u4e2a\u597d\u4e60\u60ef\uff0c\u53ef\u4ee5\u7b80\u5316\u5ba2\u6237\u7aef\u4f7f\u7528RPC\u65b9\u5f0f\u7f16\u5199\u4ee3\u7801\u3002</p> <pre><code>public interface Hello {\n String sayHi(String name);\n String sayHello(Person person);\n}\n</code></pre>"},{"location":"build-provider/jaxrs.html#2","title":"\u6b65\u9aa4 2\u5b9e\u73b0\u670d\u52a1\u3002","text":"<p>\u4f7f\u7528JAX-RS\u6ce8\u89e3\u5f00\u53d1\u4e1a\u52a1\u4ee3\u7801\uff0cHello\u7684\u670d\u52a1\u5b9e\u73b0\u5982\u4e0b\uff1a</p> <pre><code>@RestSchema(schemaId = \"jaxrsHello\")\n@Path(\"/jaxrshello\")\n@Produces(MediaType.APPLICATION_JSON)\npublic class JaxrsHelloImpl implements Hello {\n @Path(\"/sayhi\")\n @POST\n @Override\n public String sayHi(String name) {\n return \"Hello \" + name;\n }\n\n @Path(\"/sayhello\")\n @POST\n @Override\n public String sayHello(Person person) {\n return \"Hello person \" + person.getName();\n }\n /**\n * \u8fd9\u4e2a\u65b9\u6cd5\u662f\u5b9e\u73b0\u7c7b\u7279\u6709\u7684,\u56e0\u6b64\u5bf9\u5b83\u7684\u8fdc\u7a0b\u8c03\u7528\u4f1a\u6709\u6240\u4e0d\u540c.\n * \u5177\u4f53\u53ef\u4ee5\u53c2\u8003 jaxrs-consumer\n */\n @Path(\"/saybye\")\n @GET\n public String sayBye() {\n return \"Bye !\";\n }\n}\n</code></pre>"},{"location":"build-provider/jaxrs.html#3","title":"\u6b65\u9aa4 3\u53d1\u5e03\u670d\u52a1\u3002","text":"<p>\u5728resources/META-INF/spring\u76ee\u5f55\u4e0b\u521b\u5efajaxrsHello.bean.xml\u6587\u4ef6\uff0c\u914d\u7f6espring\u8fdb\u884c\u670d\u52a1\u626b\u63cf\u7684base-package\uff0c\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u3002\uff08\u6ce8\u610f\u4fee\u6539package\u540d\u79f0\u4e3a\u6b63\u786e\u540d\u79f0\uff09</p> <pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;beans xmlns=\" http://www.springframework.org/schema/beans \" xmlns:xsi=\" http://www.w3.org/2001/XMLSchema-instance \"\n xmlns:p=\" http://www.springframework.org/schema/p \" xmlns:util=\" http://www.springframework.org/schema/util \"\n xmlns:cse=\" http://www.huawei.com/schema/paas/cse/rpc \"\n xmlns:context=\" http://www.springframework.org/schema/context \"\n xsi:schemaLocation=\" http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.huawei.com/schema/paas/cse/rpc classpath:META-INF/spring/spring-paas-cse-rpc.xsd\"&gt;\n\n &lt;context:component-scan base-package=\"org.apache.servicecomb.samples.jaxrs.provider\"/&gt;\n&lt;/beans&gt;\n</code></pre>"},{"location":"build-provider/jaxrs.html#4","title":"\u6b65\u9aa4 4\u542f\u52a8\u670d\u52a1\u3002","text":"<pre><code>public class JaxrsProviderMain{\n\n public static void main(String[] args) throws Exception {\n Log4jUtils.init();\n BeanUtils.init();\n }\n}\n</code></pre>"},{"location":"build-provider/jaxrs.html#api","title":"\u6d89\u53caAPI","text":"<p>JAX-RS\u5f00\u53d1\u6a21\u5f0f\u5f53\u524d\u652f\u6301\u5982\u4e0b\u6ce8\u89e3\uff0c\u6240\u6709\u6ce8\u89e3\u7684\u4f7f\u7528\u65b9\u6cd5\u53c2\u8003 JAX-RS\u5b98\u65b9\u6587\u6863\u3002</p>"},{"location":"build-provider/jaxrs.html#1-1jax-rs","title":"\u88681-1JAX-RS\u6ce8\u89e3\u652f\u6301\u6c47\u603b","text":"\u6ce8\u89e3 \u4f4d\u7f6e \u63cf\u8ff0 javax.ws.rs.Path schema/operation URL\u8def\u5f84 javax.ws.rs.Produces schema/operation \u65b9\u6cd5\u652f\u6301\u7684\u7f16\u89e3\u7801\u80fd\u529b javax.ws.rs.DELETE operation http method javax.ws.rs.GET operation http method javax.ws.rs.POST operation http method javax.ws.rs.PUT operation http method javax.ws.rs.QueryParam parameter \u4ecequery string\u4e2d\u83b7\u53d6\u53c2\u6570 javax.ws.rs.PathParam parameter \u4ecepath\u4e2d\u83b7\u53d6\u53c2\u6570\uff0c\u5fc5\u987b\u5728path\u4e2d\u5b9a\u4e49\u8be5\u53c2\u6570 javax.ws.rs.HeaderParam parameter \u4eceheader\u4e2d\u83b7\u53d6\u53c2\u6570 javax.ws.rs.CookieParam parameter \u4ececookie\u4e2d\u83b7\u53d6\u53c2\u6570 javax.ws.rs.FormParam parameter \u4eceform\u4e2d\u83b7\u53d6\u53c2\u6570 javax.ws.rs.BeanParam parameter \u7528\u4e8e\u53c2\u6570\u805a\u5408\uff0c\u5141\u8bb8\u5728\u4e00\u4e2aJavaBean\u7684\u5c5e\u6027\u4e0a\u6253\u4e0a\u53c2\u6570\u6807\u8bb0\u4ee5\u5c06\u591a\u4e2a\u53c2\u6570\u805a\u5408\u4e3a\u4e00\u4e2aJavaBean <p>\u8bf4\u660e:</p> <ul> <li>\u5f53\u65b9\u6cd5\u53c2\u6570\u6ca1\u6709\u6ce8\u89e3\uff0c\u4e14\u4e0d\u4e3a<code>HttpServletRequest</code>\u3001<code>InvocationContext</code>\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u9ed8\u8ba4\u4e3abody\u7c7b\u578b\u53c2\u6570\uff0c\u4e00\u4e2a\u65b9\u6cd5\u6700\u591a\u53ea\u652f\u6301\u4e00\u4e2abody\u7c7b\u578b\u53c2\u6570\u3002</li> </ul>"},{"location":"build-provider/jaxrs.html#beanparam","title":"\u4f7f\u7528@BeanParam\u805a\u5408\u53c2\u6570","text":""},{"location":"build-provider/jaxrs.html#_3","title":"\u4f7f\u7528\u8bf4\u660e","text":"<p>\u7528\u6237\u53ef\u4ee5\u4f7f\u7528@BeanParam\u6ce8\u89e3\u5c06\u591a\u4e2a\u53c2\u6570\u805a\u5408\u5230\u4e00\u4e2aJavaBean\u4e2d\uff0c\u901a\u8fc7\u5c06@QueryParam\u7b49\u53c2\u6570\u6ce8\u89e3\u6253\u5728\u6b64JavaBean\u7684\u5c5e\u6027\u6216setter\u65b9\u6cd5\u4e0a\u6765\u58f0\u660e\u53c2\u6570\uff0c\u4ece\u800c\u7b80\u5316\u4e1a\u52a1\u63a5\u53e3\u7684\u53c2\u6570\u8868\u3002\u53ef\u4ee5\u53c2\u8003JAX-RS\u7684\u5b98\u65b9\u8bf4\u660e\uff1ahttps://docs.oracle.com/javaee/7/api/javax/ws/rs/BeanParam.html</p> <p>ServiceComb\u73b0\u5728\u4e5f\u652f\u6301\u7c7b\u4f3c\u7684\u7528\u6cd5\uff0c\u8be5\u7528\u6cd5\u7684\u8981\u6c42\u5982\u4e0b\uff1a 1. \u805a\u5408\u53c2\u6570\u6240\u7528\u7684\u7c7b\u578b\u5fc5\u987b\u662f\u6807\u51c6\u7684JavaBean\uff0c\u5373\u7c7b\u578b\u7684\u5c5e\u6027\u4e0egetter\u3001setter\u65b9\u6cd5\u540d\u79f0\u5339\u914d\uff0csetter\u65b9\u6cd5\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code>void</code> 2. \u53c2\u6570\u6ce8\u89e3\u53ef\u4ee5\u6253\u5728JavaBean\u7684\u5c5e\u6027\u6216setter\u65b9\u6cd5\u4e0a 3. \u5141\u8bb8\u901a\u8fc7@FormParam\u5c06\u591a\u4e2a\u4e0a\u4f20\u6587\u4ef6\u53c2\u6570\u805a\u5408\u5230JavaBean\u4e2d 4. \u4f5c\u4e3aBeanParam\u7684JavaBean\u5185\u90e8\u5982\u679c\u6709\u591a\u4f59\u7684\u5c5e\u6027\uff0c\u9700\u8981\u6253\u4e0a<code>@JsonIgnore</code>\u5ffd\u7565\u6389 5. body\u53c2\u6570\u65e0\u6cd5\u805a\u5408\u8fdbBeanParam 6. Consumer\u7aef\u4e0d\u652f\u6301\u5c06\u53c2\u6570\u805a\u5408\u4e3aJavaBean\u53d1\u9001\uff0c\u5373\u4ecd\u7136\u9700\u8981\u6309\u7167\u63a5\u53e3\u5951\u7ea6\u5355\u72ec\u586b\u5199\u5404\u4e2a\u53c2\u6570</p>"},{"location":"build-provider/jaxrs.html#_4","title":"\u4ee3\u7801\u793a\u4f8b","text":""},{"location":"build-provider/jaxrs.html#provider","title":"Provider\u7aef\u5f00\u53d1\u670d\u52a1","text":"<ul> <li>Provider\u7aef\u4e1a\u52a1\u63a5\u53e3\u4ee3\u7801\uff1a</li> </ul> <pre><code> @RestSchema(schemaId = \"helloService\")\n @Path(\"/hello\")\n public class HelloService {\n @Path(\"/sayHello/{name}\")\n @GET\n public String sayHello(@BeanParam Person person) {\n System.out.println(\"sayHello is called, person = [\" + person + \"]\");\n return \"Hello, your name is \" + person.getName() + \", and age is \" + person.getAge();\n }\n }\n</code></pre> <ul> <li>BeanParam\u53c2\u6570\u5b9a\u4e49\uff1a</li> </ul> <pre><code> public class Person {\n private String name;\n @QueryParam(\"age\")\n private int age;\n @PathParam(\"name\")\n public void setName(String name) {\n this.name = name;\n }\n @JsonIgnore // \u5ffd\u7565\u590d\u6742\u5c5e\u6027\n private List&lt;Person&gt; children;\n\n // \u5176\u4ed6\u65b9\u6cd5\u5ffd\u7565\n }\n</code></pre> <ul> <li>\u63a5\u53e3\u5951\u7ea6\uff1a</li> </ul> <pre><code># \u5ffd\u7565\u5951\u7ea6\u7684\u5176\u4ed6\u90e8\u5206\nbasePath: \"/hello\"\npaths:\n /sayHello/{name}:\n get:\n operationId: \"sayHello\"\n parameters:\n - name: \"name\"\n in: \"path\"\n required: true\n type: \"string\"\n - name: \"age\"\n in: \"query\"\n required: false\n type: \"integer\"\n format: \"int32\"\n responses:\n 200:\n description: \"response of 200\"\n schema:\n type: \"string\"\n</code></pre>"},{"location":"build-provider/jaxrs.html#consumer","title":"Consumer\u7aef\u8c03\u7528\u670d\u52a1","text":"<p>consumer\u7aefRPC\u5f00\u53d1\u6a21\u5f0f\uff1a</p> <ul> <li>Provider\u63a5\u53e3\u5b9a\u4e49</li> </ul> <pre><code>public interface HelloServiceIntf {\n String sayHello(String name, int age);\n}\n</code></pre> <ul> <li>\u8c03\u7528\u4ee3\u7801</li> </ul> <pre><code>String result = helloService.sayHello(\"Bob\", 22); // result\u7684\u503c\u4e3a\"Hello, your name is Bob, and age is 22\"\n</code></pre> <ul> <li>consumer\u7aefRestTemplate\u5f00\u53d1\u6a21\u5f0f\uff1a</li> </ul> <pre><code>String result = restTemplate.getForObject(\n \"cse://provider-service/hello/sayHello/Bob?age=22\",\n String.class); // \u8c03\u7528\u6548\u679c\u4e0eRPC\u65b9\u5f0f\u76f8\u540c\n</code></pre>"},{"location":"build-provider/listen-address-and-publish-address.html","title":"\u670d\u52a1\u76d1\u542c\u5730\u5740\u548c\u53d1\u5e03\u5730\u5740","text":""},{"location":"build-provider/listen-address-and-publish-address.html#_2","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u5728JavaChassis\u4e2d\uff0c\u670d\u52a1\u7684\u76d1\u542c\u5730\u5740\u548c\u53d1\u5e03\u5730\u5740\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u6982\u5ff5\uff0c\u53ef\u4ee5\u72ec\u7acb\u914d\u7f6e\uff1a</p> <ul> <li>\u76d1\u542c\u5730\u5740\uff1a\u6307\u5fae\u670d\u52a1\u5b9e\u4f8b\u542f\u52a8\u65f6\u76d1\u542c\u7684\u5730\u5740\u3002\u8be5\u914d\u7f6e\u9879\u51b3\u5b9a\u4e86\u53ef\u4ee5\u901a\u8fc7\u54ea\u4e9bIP\u8bbf\u95ee\u6b64\u670d\u52a1\u3002</li> <li>\u53d1\u5e03\u5730\u5740\uff1a\u6307\u5fae\u670d\u52a1\u5b9e\u4f8b\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u7684\u5730\u5740\u3002\u5176\u4ed6\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\u4f1a\u901a\u8fc7\u670d\u52a1\u4e2d\u5fc3\u83b7\u53d6\u6b64\u5b9e\u4f8b\u7684\u4fe1\u606f\uff0c\u6839\u636e\u53d1\u5e03\u5730\u5740\u8bbf\u95ee\u6b64\u670d\u52a1\u5b9e\u4f8b\uff0c\u6240\u4ee5\u8be5\u914d\u7f6e\u9879\u51b3\u5b9a\u4e86\u5176\u4ed6\u670d\u52a1\u5b9e\u9645\u4e0a\u4f1a\u4f7f\u7528\u54ea\u4e2aIP\u8bbf\u95ee\u6b64\u670d\u52a1\u3002</li> </ul>"},{"location":"build-provider/listen-address-and-publish-address.html#_3","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7528\u6237\u901a\u8fc7\u914d\u7f6e\u670d\u52a1\u7684\u76d1\u542c\u5730\u5740\u548c\u53d1\u5e03\u5730\u5740\u6765\u786e\u5b9a\u670d\u52a1\u5b9e\u4f8b\u76d1\u542c\u7684IP\u548c\u5176\u4ed6\u670d\u52a1\u5b9e\u4f8b\u8bbf\u95ee\u672c\u5b9e\u4f8b\u65f6\u8bf7\u6c42\u7684IP\u3002</p>"},{"location":"build-provider/listen-address-and-publish-address.html#_4","title":"\u914d\u7f6e\u8bf4\u660e","text":"<p>\u670d\u52a1\u76d1\u542c\u5730\u5740\u7684\u914d\u7f6e\u9879\u662f<code>servicecomb.rest.address</code>\u548c<code>servicecomb.highway.address</code>\uff0c\u5206\u522b\u5bf9\u5e94rest\u4f20\u8f93\u65b9\u5f0f\u548chighway\u4f20\u8f93\u65b9\u5f0f\u7684\u76d1\u542c\u5730\u5740\u3002\u4e24\u8005\u7684\u914d\u7f6e\u89c4\u5219\u76f8\u540c\uff0c\u4ee5\u4e0b\u4ec5\u4ee5<code>servicecomb.rest.address</code>\u4f5c\u4e3a\u8bf4\u660e\u3002 \u670d\u52a1\u53d1\u5e03\u5730\u5740\u7684\u914d\u7f6e\u9879\u662f<code>servicecomb.service.publishAddress</code>\uff0c\u8be5\u5730\u5740\u53ef\u4ee5\u4e0d\u914d\u7f6e\u3002\u4e0d\u914d\u7f6e\u6b64\u9879\u65f6JavaChassis\u4f1a\u6839\u636e\u7279\u5b9a\u7684\u89c4\u5219\u9009\u53d6\u53d1\u5e03\u5730\u5740\u3002</p> <p>\u88681 \u670d\u52a1\u53d1\u5e03\u5730\u5740\u751f\u6548\u89c4\u5219</p> \u89c4\u5219\u7f16\u53f7 \u76d1\u542c\u5730\u5740\u914d\u7f6e \u53d1\u5e03\u5730\u5740\u914d\u7f6e \u5b9e\u9645\u751f\u6548\u7684\u53d1\u5e03\u5730\u5740 1 127.0.0.1 - 127.0.0.1 2 0.0.0.0 - \u9009\u53d6\u4e00\u5f20\u7f51\u5361\u7684IP\u5730\u5740\u4f5c\u4e3a\u53d1\u5e03\u5730\u5740\u3002\u8981\u6c42\u8be5\u5730\u5740\u4e0d\u80fd\u662f\u901a\u914d\u7b26\u5730\u5740\u3001\u56de\u73af\u5730\u5740\u6216\u5e7f\u64ad\u5730\u5740 3 \u5177\u4f53IP - \u4e0e\u76d1\u542c\u5730\u5740\u4e00\u81f4 4 * \u5177\u4f53IP \u4e0e\u53d1\u5e03\u5730\u5740\u914d\u7f6e\u9879\u4e00\u81f4 5 * \"{\u7f51\u5361\u540d}\" \u6307\u5b9a\u7f51\u5361\u540d\u7684IP\uff0c\u6ce8\u610f\u9700\u8981\u52a0\u4e0a\u5f15\u53f7\u548c\u62ec\u53f7 <p>\u8bf4\u660e\uff1a - \u670d\u52a1\u5b9e\u4f8b\u5b9e\u9645\u76d1\u542c\u7684\u5730\u5740\u59cb\u7ec8\u4e0e\u76d1\u542c\u5730\u5740\u914d\u7f6e\u9879\u4fdd\u6301\u4e00\u81f4\u3002 - \u4f7f\u7528\u7f51\u5361\u540d\u914d\u7f6e\u53d1\u5e03\u5730\u5740\u65f6\uff0c\u8981\u6c42\u4f7f\u7528\u53cc\u5f15\u53f7\u5305\u88f9\u4f4f\u7f51\u5361\u540d\u5360\u4f4d\u7b26\uff0c\u5426\u5219\u4f1a\u9020\u6210\u89e3\u6790\u914d\u7f6e\u62a5\u9519\u3002 - \u7f51\u5361\u540d\u5fc5\u987b\u662f\u4e3b\u673a\u5b58\u5728\u7684\u7f51\u5361\u3002</p>"},{"location":"build-provider/listen-address-and-publish-address.html#_5","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>microservice.yaml\u6587\u4ef6\u7684\u914d\u7f6e\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n service:\n publishAddress: \"{eth0}\" # \u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u7684\u53d1\u5e03\u5730\u5740\u4f1a\u662feth0\u7f51\u5361\u7684IP\n rest:\n publishPort: 8888 # \u53d1\u5e03\u5730\u5740\u7aef\u53e3\uff0c\u4e0d\u914d\u7f6e\u9ed8\u8ba4\u4e0e\u76d1\u542c\u5730\u5740\u7aef\u53e3\u4e00\u81f4\n address: 0.0.0.0:8080 # \u76d1\u542c\u4e3b\u673a\u7684\u5168\u90e8\u7f51\u5361IP\n highway:\n publishPort: 8888 # \u53d1\u5e03\u5730\u5740\u7aef\u53e3\uff0c\u4e0d\u914d\u7f6e\u9ed8\u8ba4\u4e0e\u76d1\u542c\u5730\u5740\u7aef\u53e3\u4e00\u81f4\n address: 0.0.0.0:7070 # \u76d1\u542c\u4e3b\u673a\u7684\u5168\u90e8\u7f51\u5361IP\n</code></pre>"},{"location":"build-provider/multi-code.html","title":"\u591a\u4e2a\u8fd4\u56de\u503c\u548c\u9519\u8bef\u7801","text":"<p>\u4f7f\u7528\u900f\u660eRPC\u5f00\u53d1\u670d\u52a1\u63d0\u4f9b\u8005\uff0c\u5f00\u53d1\u8005\u5f88\u5bb9\u6613\u7406\u89e3\u4e00\u4e2a\u63a5\u53e3\u53ea\u6709\u4e00\u4e2a\u8fd4\u56de\u503c\u7c7b\u578b\u3002\u4f7f\u7528REST\u98ce\u683c\uff08Spring MVC \u6216\u8005 JAXRS\uff09\uff0c\u5f88\u591a\u573a\u666f\u4f1a\u78b0\u5230 \u591a\u4e2a\u8fd4\u56de\u503c\u548c\u9519\u8bef\u7801\u7684\u60c5\u51b5\u3002\u548c\u5f88\u591a\u5176\u4ed6\u5f00\u53d1\u6846\u67b6\uff08\u6bd4\u5982Servlet\u3001Spring MVC\u7b49\uff09\u4e0d\u4e00\u6837\uff0cJava Chassis\u8981\u6c42\u63a5\u53e3\u5b9a\u4e49\u7684\u8fd4\u56de\u503c\u548c\u9519\u8bef\u7801\u90fd \u5fc5\u987b\u663e\u793a\u7684\u58f0\u660e\uff0c\u5373\u901a\u8fc7\u4ee3\u7801\u751f\u6210\u7684swagger\uff0c\u5fc5\u987b\u5305\u542b\u6240\u6709\u7684\u9519\u8bef\u7801\u63cf\u8ff0\u548c\u8fd4\u56de\u503c\u7c7b\u578b\u63cf\u8ff0\u3002 \u5728Java Chassis\uff0c\u65e0\u6cd5\u4f7f\u7528\u9690\u85cf\u53c2\u6570\u3001\u672a\u58f0\u660e \u7684\u9519\u8bef\u7801\u3002\u8fd9\u6837\u8bbe\u8ba1\u7684\u76f4\u63a5\u597d\u5904\u662f\u63a5\u53e3\u5b9a\u4e49\u66f4\u52a0\u660e\u786e\uff0c\u4e0d\u9700\u8981\u989d\u5916\u7684\u6587\u6863\u5e2e\u52a9\u4f7f\u7528\u8005\u7406\u89e3\u63a5\u53e3\u7684\u4f7f\u7528\u65b9\u6cd5\u3002 </p> <p>\u5728\u524d\u9762\u7684\u5f00\u53d1\u6307\u5bfc\u91cc\u9762\uff0c\u4e3b\u8981\u4ecb\u7ecd\u4e86\u4e00\u4e2a\u8fd4\u56de\u503c\u548c\u4e00\u4e2a\u9519\u8bef\u7801\u7684\u60c5\u51b5\uff08200\uff09\u3002 \u4e0b\u9762\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528\u591a\u4e2a\u9519\u8bef\u7801\u548c\u8fd4\u56de\u503c\uff0c\u540c\u65f6\u4f1a\u4ecb\u7ecd\u5982\u4f55\u8fd4\u56de\u989d\u5916\u7684 header\u53c2\u6570\u3002 </p> <p>Java Chassis\u5c06\u9519\u8bef\u7801\u8fdb\u884c\u4e86\u5206\u7c7b\uff1a2xx\u9519\u8bef\u7801\u8ba4\u4e3a\u662f\u4e00\u4e2a\u6b63\u5e38\u7684\u54cd\u5e94\uff0c\u4e00\u4e2a\u63a5\u53e3\u53ea\u5141\u8bb8\u5b58\u5728\u4e00\u4e2a\u6b63\u5e38\u54cd\u5e94\u9519\u8bef\u7801\uff1b \u5176\u4ed6\u9519\u8bef\u7801\u8ba4\u4e3a\u662f\u4e00\u4e2a\u5f02\u5e38\u7684\u54cd\u5e94\uff0c\u4e00\u4e2a\u63a5\u53e3\u53ef\u4ee5\u5b9a\u4e49\u591a\u4e2a\u5f02\u5e38\u7684\u54cd\u5e94\uff0c\u5e76\u4e14\u9700\u8981\u91c7\u7528InvocationException\u7684\u65b9\u5f0f\u5c06\u5f02\u5e38\u629b\u51fa\uff0c\u6bcf\u4e2a\u9519\u8bef\u7801\u53ef\u4ee5\u6307\u5b9a \u4e0d\u540c\u7684\u54cd\u5e94\u7c7b\u578b\u3002 </p> <ul> <li>\u91c7\u7528<code>ApiResponse</code>\u5b9a\u4e49\u591a\u4e2a\u8fd4\u56de\u503c\u548c\u9519\u8bef\u7801</li> </ul> <pre><code>@Path(\"/errorCode\")\n@POST\n@ApiResponses({\n @ApiResponse(code = 200, response = MultiResponse200.class, message = \"\"),\n @ApiResponse(code = 400, response = MultiResponse400.class, message = \"\"),\n @ApiResponse(code = 500, response = MultiResponse500.class, message = \"\")})\npublic MultiResponse200 errorCode(MultiRequest request) {\n if (request.getCode() == 400) {\n MultiResponse400 r = new MultiResponse400();\n r.setCode(400);\n r.setMessage(\"bad request\");\n throw new InvocationException(javax.ws.rs.core.Response.Status.BAD_REQUEST, r);\n } else if (request.getCode() == 500) {\n MultiResponse500 r = new MultiResponse500();\n r.setCode(500);\n r.setMessage(\"internal error\");\n throw new InvocationException(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, r);\n } else {\n MultiResponse200 r = new MultiResponse200();\n r.setCode(200);\n r.setMessage(\"success result\");\n return r;\n }\n}\n</code></pre> <ul> <li>\u91c7\u7528 <code>org.apache.servicecomb.swagger.invocation.Response</code> \u54cd\u5e94\u7c7b\u578b</li> </ul> <p>\u91c7\u7528 <code>org.apache.servicecomb.swagger.invocation.Response</code> \u54cd\u5e94\u7c7b\u578b\uff0c\u9664\u4e86\u53ef\u4ee5\u5b9a\u4e49\u591a\u4e2a\u9519\u8bef\u7801\u548c\u54cd\u5e94\u7c7b\u578b\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7 <code>ResponseHeader</code> \u5b9a\u4e49\u989d\u5916\u7684\u54cd\u5e94\u5934\u3002 </p> <pre><code>@Path(\"/errorCode\")\n@POST\n@ApiResponses({\n @ApiResponse(code = 200, response = MultiResponse200.class, message = \"\"),\n @ApiResponse(code = 400, response = MultiResponse400.class, message = \"\"),\n @ApiResponse(code = 500, response = MultiResponse500.class, message = \"\")})\n@ResponseHeaders({@ResponseHeader(name = \"x-code\", response = String.class)})\npublic Response errorCodeWithHeader(MultiRequest request) {\n Response response = new Response();\n if (request.getCode() == 400) {\n MultiResponse400 r = new MultiResponse400();\n r.setCode(400);\n r.setMessage(\"bad request\");\n response.setStatus(Status.BAD_REQUEST);\n response.setResult(new InvocationException(Status.BAD_REQUEST, r));\n response.setHeader(\"x-code\", \"400\");\n } else if (request.getCode() == 500) {\n MultiResponse500 r = new MultiResponse500();\n r.setCode(500);\n r.setMessage(\"internal error\");\n response.setStatus(Status.INTERNAL_SERVER_ERROR);\n response.setResult(new InvocationException(Status.INTERNAL_SERVER_ERROR, r));\n response.setHeader(\"x-code\", \"500\");\n } else {\n MultiResponse200 r = new MultiResponse200();\n r.setCode(200);\n r.setMessage(\"success result\");\n response.setStatus(Status.OK);\n response.setResult(r);\n response.setHeader(\"x-code\", \"200\");\n }\n return response;\n}\n</code></pre> <ul> <li>\u91c7\u7528 <code>javax.ws.rs.core.Response</code> \u54cd\u5e94\u7c7b\u578b</li> </ul> <p>\u91c7\u7528 <code>javax.ws.rs.core.Response</code> \u54cd\u5e94\u7c7b\u578b\uff0c\u9664\u4e86\u53ef\u4ee5\u5b9a\u4e49\u591a\u4e2a\u9519\u8bef\u7801\u548c\u54cd\u5e94\u7c7b\u578b\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7 <code>ResponseHeader</code> \u5b9a\u4e49\u989d\u5916\u7684\u54cd\u5e94\u5934\u3002 </p> <pre><code>@Path(\"/errorCodeWithHeaderJAXRS\")\n@POST\n@ApiResponses({\n @ApiResponse(code = 200, response = MultiResponse200.class, message = \"\"),\n @ApiResponse(code = 400, response = MultiResponse400.class, message = \"\"),\n @ApiResponse(code = 500, response = MultiResponse500.class, message = \"\")})\npublic javax.ws.rs.core.Response errorCodeWithHeaderJAXRS(MultiRequest request) {\n javax.ws.rs.core.Response response;\n if (request.getCode() == 400) {\n MultiResponse400 r = new MultiResponse400();\n r.setCode(request.getCode());\n r.setMessage(request.getMessage());\n response = javax.ws.rs.core.Response.status(Status.BAD_REQUEST)\n .entity(new InvocationException(Status.BAD_REQUEST, r))\n .header(\"x-code\", \"400\")\n .build();\n } else if (request.getCode() == 500) {\n MultiResponse500 r = new MultiResponse500();\n r.setCode(request.getCode());\n r.setMessage(request.getMessage());\n response = javax.ws.rs.core.Response.status(Status.INTERNAL_SERVER_ERROR)\n .entity(new InvocationException(Status.INTERNAL_SERVER_ERROR, r))\n .header(\"x-code\", \"500\")\n .build();\n } else {\n MultiResponse200 r = new MultiResponse200();\n r.setCode(request.getCode());\n r.setMessage(request.getMessage());\n // If error code is OK family(like 200), we can use the target type.\n response = javax.ws.rs.core.Response.status(Status.OK)\n .entity(r)\n .header(\"x-code\", \"200\")\n .build();\n }\n return response;\n}\n</code></pre>"},{"location":"build-provider/parameter-validator.html","title":"\u53c2\u6570\u6548\u9a8c","text":""},{"location":"build-provider/parameter-validator.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7528\u6237\u5728provider\u7aef\u4f7f\u7528\u53c2\u6570\u6548\u9a8c\uff0c\u53ef\u4ee5\u5bf9\u76f8\u5e94\u7684\u53c2\u6570\u8f93\u5165\u8981\u6c42\u9884\u5148\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5728\u63a5\u53e3\u5b9e\u9645\u8c03\u7528\u524d\u8fdb\u884c\u6548\u9a8c\u5904\u7406\uff0c\u8fbe\u5230\u63a7\u5236\u53c2\u6570\u8f93\u5165\u6807\u51c6\u7684\u6548\u679c\u3002</p>"},{"location":"build-provider/parameter-validator.html#_2","title":"\u914d\u7f6e\u8bf4\u660e","text":"<ul> <li> <p>\u6dfb\u52a0swagger-invocation-validator\u7684pom\u4f9d\u8d56\uff1a</p> <pre><code>```xml\n&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;swagger-invocation-validator&lt;/artifactId&gt;\n&lt;/dependency&gt;\n```\n</code></pre> </li> <li> <p>\u5728\u9700\u8981\u9a8c\u8bc1\u7684\u4ee3\u7801\u4e0a\u6309\u7167JSR 349\u89c4\u8303\u6dfb\u52a0\u9a8c\u8bc1\u5668\u6ce8\u89e3\uff0c\u5982@NotNull\uff0c@Min\uff0c@Max\u7b49\u3002</p> </li> </ul>"},{"location":"build-provider/parameter-validator.html#_3","title":"\u793a\u4f8b\u4ee3\u7801","text":"<ul> <li>\u63a5\u53e3\u53c2\u6570\u9a8c\u8bc1</li> </ul> <pre><code>@RestSchema(schemaId = \"validator\")\n@Path(\"/validator\")\n@Produces(MediaType.APPLICATION_JSON)\npublic class Validator {\n\n @Path(\"/add\")\n @POST\n public int add(@FormParam(\"a\") int a, @Min(20) @FormParam(\"b\") int b) {\n return a + b;\n }\n\n @Path(\"/sayhi/{name}\")\n @PUT\n public String sayHi(@Length(min = 3) @PathParam(\"name\") String name) {\n ContextUtils.getInvocationContext().setStatus(202);\n return name + \" sayhi\";\n }\n\n @Path(\"/sayhello\")\n @POST\n public Student sayHello(@Valid Student student) {\n student.setName(\"hello \" + student.getName());\n student.setAge(student.getAge());\n return student;\n }\n}\n</code></pre> <ul> <li>bean\u7c7b\u9a8c\u8bc1</li> </ul> <p>\u9700\u8981\u5728\u4f20\u5165\u7684Student\u5bf9\u8c61\u524d\u52a0@Valid\uff0c\u5982\u4e0a\u56fesayHello(@Valid Student student)\u65b9\u6cd5\u3002</p> <pre><code>public class Student {\n @NotNull\n private String name;\n\n @Max(20)\n private int age;\n\n public void setName(String name) {\n this.name = name;\n }\n\n public String getName() {\n return this.name;\n }\n\n public void setAge(int age) {\n this.age = age;\n }\n\n public int getAge() {\n return age;\n }\n}\n</code></pre>"},{"location":"build-provider/parameter-validator.html#_4","title":"\u81ea\u5b9a\u4e49\u8fd4\u56de\u5f02\u5e38","text":"<ul> <li>\u9ed8\u8ba4\u7684\u53c2\u6570\u6548\u9a8c\u5668ParameterValidator\u5df2\u7ecf\u5b9e\u73b0\u4e86\u63a5\u53e3ProducerInvokeExtension\uff0c\u6309\u7167JSR 349\u89c4\u8303\u5904\u7406\u6240\u9700\u7684\u53c2\u6570\u9a8c\u8bc1\u3002</li> </ul> <p>\u5982\u679c\u4efb\u4f55\u53c2\u6570\u9a8c\u8bc1\u5931\u8d25\uff0c\u7f3a\u7701\u9519\u8bef\u662fBAD_REQUEST(400, \"Bad Request\")\u3002</p> <p>\u8fd4\u56de\u9519\u8bef\u652f\u6301\u81ea\u5b9a\u4e49\u6269\u5c55\uff0c\u4f7f\u7528SPI\u673a\u5236\u3002</p> <ul> <li> <p>\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0\u63a5\u53e3ExceptionToProducerResponseConverter\u6765\u81ea\u5b9a\u4e49\u8fd4\u56de\u7684\u9519\u8bef\u4fe1\u606f\uff0c\u4ee5ConstraintViolationExceptionToProducerResponseConverter\u4e3a\u4f8b\u3002</p> </li> <li> <p>\u5b9e\u73b0ExceptionToProducerResponseConverter\u63a5\u53e3\uff0c\u91cd\u5199\u65b9\u6cd5\uff0c\u5176\u4e2dgetOrder\u65b9\u6cd5\u7684\u8fd4\u56de\u7ed3\u679c\u8868\u793a\u8be5\u9a8c\u8bc1\u5668\u7684\u4f18\u5148\u7ea7\uff0c\u503c\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8\u3002</p> <p>```java public class ConstraintViolationExceptionToProducerResponseConverter implements ExceptionToProducerResponseConverter { @Override public Class getExceptionClass() { return ConstraintViolationException.class; } <p>@Override public Response convert(SwaggerInvocation swaggerInvocation, ConstraintViolationException e) { return Response.createFail(new InvocationException(Status.BAD_REQUEST, e.getConstraintViolations().toString())); }</p> <p>@Override public int getOrder() { return -100; } } ```</p> <li> <p>\u5728META-INF\u4e0b\u7684services\u6587\u4ef6\u5939\u589e\u52a0\u4e00\u4e2a\u6587\u4ef6\uff0c\u4ee5\u6240\u5b9e\u73b0\u63a5\u53e3x.x.x.ExceptionToProducerResponseConverter(\u5e26\u5305\u540d)\u4e3a\u540d\uff0c\u4ee5\u5177\u4f53\u5b9e\u73b0\u7c7bx.x.x.ConstraintViolationExceptionToProducerResponseConverter(\u5e26\u5305\u540d)\u4e3a\u5185\u5bb9\u3002</p> </li>"},{"location":"build-provider/reactive.html","title":"\u5f02\u6b65\u5904\u7406","text":"<p>\u5f02\u6b65\u5904\u7406\u53ef\u4ee5\u66f4\u52a0\u5145\u5206\u7684\u5229\u7528CPU\uff0c\u63d0\u5347\u5e94\u7528\u7a0b\u5e8f\u7684\u6027\u80fd\u3002\u76f8\u5bf9\u4e8e\u540c\u6b65\u5904\u7406\uff0c\u5f02\u6b65\u5904\u7406\u7684\u5f00\u53d1\u8fc7\u7a0b\u66f4\u52a0\u590d\u6742\uff0c\u51fa\u73b0\u7684\u95ee\u9898\u4e5f\u66f4\u52a0\u96be\u4e8e\u5b9a\u4f4d\u3002Java Chassis \u63d0\u4f9b\u4e86\u975e\u5e38\u7075\u6d3b\u7684\u5f02\u6b65\u5904\u7406\u673a\u5236\uff0c\u4f7f\u5f97\u5f00\u53d1\u8005\u80fd\u591f\u9009\u62e9\u6027\u7684\u4f7f\u7528\u540c\u6b65\u5904\u7406\u548c\u5f02\u6b65\u5904\u7406\u3002</p>"},{"location":"build-provider/reactive.html#_2","title":"\u5b9a\u4e49\u5f02\u6b65\u5904\u7406\u7684\u63a5\u53e3\u548c\u4f7f\u7528\u5f02\u6b65\u8bbf\u95ee","text":"<p>\u5728Provider\u7aef\uff0cSpring MVC\u3001JAX RS\u548cRPC\u7684\u5f02\u6b65\u63a5\u53e3\u5b9a\u4e49\u7c7b\u4f3c\uff0c\u90fd\u4f7f\u7528<code>CompletableFuture</code>\u6765\u58f0\u660e\u5f02\u6b65\u63a5\u53e3\u3002\u4ee5\u900f\u660eRPC\u4e3a\u4f8b\uff0c\u5b9a\u4e49\u65b9\u6cd5\u5982\u4e0b\uff1a</p> <pre><code> public CompletableFuture&lt;String&gt; sayHello(String name) {\n CompletableFuture&lt;String&gt; future = new CompletableFuture&lt;&gt;();\n future.complete(name);\n return future;\n }\n</code></pre> <p>\u5728Consumer\u7aef\uff0c\u53ef\u4ee5\u4f7f\u7528\u900f\u660eRPC\u3001InvokerUtils\u3001AsyncRestTemplate\u6765\u4f7f\u7528\u5f02\u6b65\u3002\u4ee5\u900f\u660eRPC\u4e3a\u4f8b\uff0c\u9996\u5148\u58f0\u660e\u63a5\u53e3\uff1a</p> <pre><code>public interface Hello {\n @ApiOperation(nickname = \"sayHello\", value = \"\")\n CompletableFuture&lt;String&gt; sayHelloAsync(String name);\n\n String sayHello(String name);\n}\n</code></pre> <p>\u4e0a\u9762\u7684\u4f8b\u5b50\u540c\u65f6\u5b9a\u4e49\u4e86\u5f02\u6b65\u8bbf\u95ee\u7684\u63a5\u53e3\u548c\u540c\u6b65\u8bbf\u95ee\u7684\u63a5\u53e3\uff0c\u5b83\u4eec\u53ef\u4ee5\u7528\u6765\u8bbf\u95eeProvider\u7684\u540c\u4e00\u4e2a\u63a5\u53e3\u3002 \u4f7f\u7528\u5f02\u6b65\u63a5\u53e3\u548c\u4f7f\u7528\u540c\u6b65\u63a5\u53e3\u7684\u8fc7\u7a0b\u4e00\u6837\uff1a</p> <pre><code> @RpcReference(microserviceName = \"name\", schemaId = \"Hello\")\n public Hello hello;\n</code></pre>"},{"location":"build-provider/reactive.html#_3","title":"\u5f02\u6b65\u903b\u8f91\u6267\u884c\u7684\u7ebf\u7a0b\u6c60","text":"<p>\u58f0\u660e\u4e3a\u5f02\u6b65\u63a5\u53e3\uff0c\u5e76\u4e0d\u4f1a\u6539\u53d8\u4e1a\u52a1\u903b\u8f91\u5165\u53e3\u88ab\u6267\u884c\u7684\u7ebf\u7a0b\u3002\u6bd4\u5982\u5728Provider\u7aef\uff0c\u4e1a\u52a1\u903b\u8f91\u7684\u5165\u53e3\u8fd8\u662f\u5728\u540c\u6b65\u7ebf\u7a0b\u6c60\u4e2d\u6267\u884c\u7684\uff0cEdge Service\u5728event-loop\u6267\u884c\u3002 \u6539\u53d8\u5165\u53e3\u903b\u8f91\u7684\u6267\u884c\u7ebf\u7a0b\uff0c\u9700\u8981\u4fee\u6539\u65b9\u6cd5\u7684\u9ed8\u8ba4\u7ebf\u7a0b\u6c60\u3002\u5f02\u6b65\u63a5\u53e3\u6267\u884c\u5b8c\u6bd5\uff0c\u56de\u8c03\u903b\u8f91\u5728\u4e1a\u52a1\u81ea\u5b9a\u4e49\u7684\u5f02\u6b65\u6267\u884c\u7ebf\u7a0b\u6c60\u6267\u884c\u3002 </p> <p>\u8be6\u7ec6\u60c5\u51b5\u53c2\u8003\u7ebf\u7a0b\u6c60\u3002 </p> <p>\u5f02\u6b65\u903b\u8f91\u5728\u66f4\u52a0\u590d\u6742\u573a\u666f\u4e0b\u7684\u6267\u884c\u8fc7\u7a0b\uff0c\u8bf7\u53c2\u8003reactive\u3002</p>"},{"location":"build-provider/reactive.html#event-loop","title":"\u6709\u5173 event-loop \u7ebf\u7a0b\u7684\u7279\u6b8a\u8bf4\u660e","text":"<p>\u5728Edge Service\u7b49\u573a\u666f\uff0c\u6216\u8005\u5728Provider\u4f7f\u7528\u4e86\u5f02\u6b65\u7ebf\u7a0b\u6c60\u7684\u573a\u666f\uff0c\u6240\u6709\u7684\u4e1a\u52a1\u903b\u8f91\u90fd\u662f\u5728event-loop\u6267\u884c\u7684\u3002\u5728event-loop\u6267\u884c\u7684\u4e1a\u52a1\u4ee3\u7801\uff0c\u4e0d\u80fd\u5b58\u5728 \u4efb\u4f55\u963b\u585e\u64cd\u4f5c\uff0c\u5426\u5219\u4f1a\u7834\u574fevent-loop\u7684\u4e8b\u4ef6\u6d3e\u53d1\uff0c\u5bfc\u81f4\u6b7b\u9501\u3002 \u8fd9\u4e9b\u573a\u666f\u8bbf\u95ee\u5176\u4ed6\u5fae\u670d\u52a1\uff0c\u5fc5\u987b\u91c7\u7528\u5f02\u6b65\u63a5\u53e3\u3002 event-loop\u6267\u884c\u963b\u585e\u64cd\u4f5c\u5bfc\u81f4\u6b7b\u9501\u7684\u60c5\u51b5\uff0c \u6216\u8005\u5bfc\u81f4\u6027\u80fd\u4e0b\u964d\u7684\u60c5\u51b5\uff0c\u9700\u8981\u5728\u6ee1\u8db3\u4e00\u5b9a\u7684\u5e76\u53d1\u6761\u4ef6\u624d\u80fd\u591f\u51fa\u73b0\uff0c\u4e0d\u5c0f\u5fc3\u4f7f\u7528\u4f1a\u7ed9\u4e1a\u52a1\u53ef\u9760\u6027\u5e26\u6765\u5f88\u5927\u7684\u98ce\u9669\u3002 Java Chassis\u9488\u5bf9\u5e38\u89c1\u7684\u9519\u8bef\u4e5f\u63d0\u4f9b\u4e86\u4e00\u4e9b \u68c0\u6d4b\u673a\u5236\uff0c\u6bd4\u5982\u5728event-loop\u6267\u884c\u540c\u6b65Consumer\u8c03\u7528\u7684\u65f6\u5019\uff0c\u4f1a\u62a5\u544a\u5f02\u5e38\uff0c\u8ba9\u5f00\u53d1\u8005\u53ca\u65f6\u53d1\u73b0\u95ee\u9898\u3002 </p>"},{"location":"build-provider/springmvc.html","title":"\u7528 Spring MVC \u5f00\u53d1\u5fae\u670d\u52a1","text":"<p>Spring MVC \u662f spring-web \u9879\u76ee\u5b9a\u4e49\u7684\u4e00\u5957\u6ce8\u89e3\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u4f7f\u7528\u8fd9\u5957\u6ce8\u89e3\u5b9a\u4e49 REST \u63a5\u53e3\u3002 servicecomb \u4e5f \u652f\u6301\u4f7f\u7528\u8fd9\u5957\u6807\u7b7e\u5b9a\u4e49 REST \u63a5\u53e3\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cservicecomb \u53ea\u662f\u4f7f\u7528\u8fd9\u4e9b\u6ce8\u89e3\uff0c\u800c\u6ce8\u89e3\u7684\u5b9e\u73b0\u662f\u9879\u76ee\u81ea\u884c\u5f00\u53d1\u7684\uff0c \u5b9e\u73b0\u7684\u529f\u80fd\u96c6\u5408\u662f Spring MVC \u6ce8\u89e3\u7684\u5b50\u96c6\u3002\u53ef\u4ee5\u9605\u8bfb\u6587\u7ae0\u540e\u9762\u7684\u5185\u5bb9\u4e86\u89e3\u5177\u4f53\u7684\u6807\u7b7e\u96c6\u5408\u548c\u4f7f\u7528\u7ea6\u675f\u3002</p> <p>SpringMVC Sample \u63d0\u4f9b\u4e86\u4e00\u4e9b\u57fa\u7840\u7684\u4ee3\u7801\u793a\u4f8b\uff0c\u53ef\u4ee5\u4e0b\u8f7d\u4f7f\u7528\u3002</p>"},{"location":"build-provider/springmvc.html#_1","title":"\u5f00\u53d1\u6b65\u9aa4","text":"<p>\u4e0b\u9762\u7b80\u5355\u4ecb\u7ecd\u4f7f\u7528 Spring MVC \u5f00\u53d1 REST \u670d\u52a1\u7684\u4e00\u4e9b\u7b80\u5355\u6b65\u9aa4\u3002</p> <ul> <li>\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3\uff08\u53ef\u9009\uff09</li> </ul> <p>\u5b9a\u4e49\u63a5\u53e3\u662f\u4e00\u4e2a\u597d\u4e60\u60ef\uff0c \u5b83\u4e0d\u662f\u5fc5\u987b\u7684\u3002</p> <pre><code> ```java\n public interface Hello {\n String sayHi(String name);\n String sayHello(Person person);\n }\n ```\n</code></pre> <ul> <li>\u5b9e\u73b0\u670d\u52a1\u63a5\u53e3</li> </ul> <p>\u5728\u670d\u52a1\u7684\u5b9e\u73b0\u7c7b\u4e0a\u6253\u4e0a\u6ce8\u89e3 <code>@RestSchema</code>\uff0c\u6307\u5b9a <code>schemaId</code>\u3002 \u6ce8\u610f <code>schemaId</code> \u9700\u8981\u4fdd\u8bc1\u5fae\u670d\u52a1\u8303\u56f4\u5185\u552f\u4e00\u3002</p> <pre><code> ```java\n @RestSchema(schemaId = \"springmvcHello\")\n @RequestMapping(path = \"/springmvchello\", produces = MediaType.APPLICATION_JSON)\n public class SpringmvcHelloImpl implements Hello {\n @Override\n @RequestMapping(path = \"/sayhi\", method = RequestMethod.POST)\n public String sayHi(@RequestParam(name = \"name\") String name) {\n return \"Hello \" + name;\n }\n\n @Override\n @RequestMapping(path = \"/sayhello\", method = RequestMethod.POST)\n public String sayHello(@RequestBody Person person) {\n return \"Hello person \" + person.getName();\n }\n }\n ```\n</code></pre>"},{"location":"build-provider/springmvc.html#servicecomb-spring-mvc","title":"ServiceComb\u652f\u6301\u7684 Spring MVC \u6ce8\u89e3\u8bf4\u660e","text":"<p>servicecomb \u652f\u6301\u4f7f\u7528 Spring MVC \u63d0\u4f9b\u7684\u6ce8\u89e3 <code>org.springframework.web.bind.annotation</code> \u6765\u58f0 \u660eREST\u63a5\u53e3\uff0c\u4f46\u662f\u4e24\u8005\u662f\u72ec\u7acb\u7684\u5b9e\u73b0\uff0c\u800c\u4e14\u6709\u4e0d\u4e00\u6837\u7684\u8bbe\u8ba1\u76ee\u6807\u3002servicecomb \u7684\u76ee\u6807\u662f\u63d0\u4f9b\u8de8\u8bed\u8a00\u3001\u652f\u6301\u591a\u901a\u4fe1\u534f\u8bae\u7684 \u6846\u67b6\uff0c\u56e0\u6b64\u53bb\u6389\u4e86Spring MVC\u4e2d\u4e00\u4e9b\u5bf9\u8de8\u8bed\u8a00\u652f\u6301\u4e0d\u662f\u5f88\u597d\u7684\u7279\u6027\uff0c\u4e5f\u4e0d\u652f\u6301\u7279\u5b9a\u8fd0\u884c\u6846\u67b6\u5f3a\u76f8\u5173\u7684\u7279\u6027\uff0c\u6bd4 \u5982\u76f4\u63a5\u8bbf\u95eeServlet\u534f\u8bae\u5b9a\u4e49\u7684<code>HttpServletRequest</code>\u3002servicecomb \u6ca1\u6709\u5b9e\u73b0<code>@Controller</code>\u76f8\u5173\u529f \u80fd, \u53ea\u5b9e\u73b0\u4e86<code>@RestController</code>\uff0c\u5373\u901a\u8fc7MVC\u6a21\u5f0f\u8fdb\u884c\u9875\u9762\u6e32\u67d3\u7b49\u529f\u80fd\u90fd\u662f\u4e0d\u652f\u6301\u7684\u3002</p> <p>\u4e0b\u9762\u662f\u4e00\u4e9b\u5177\u4f53\u5dee\u5f02\u3002</p> <ul> <li>\u5e38\u7528\u6807\u7b7e\u652f\u6301</li> </ul> <p>\u4e0b\u9762\u662fCSE\u5bf9\u4e8eSpring MVC\u5e38\u7528\u6807\u7b7e\u7684\u652f\u6301\u60c5\u51b5\u3002</p> <p>\u88681-1 Spring MVC\u6ce8\u89e3\u60c5\u51b5\u8bf4\u660e</p> \u6807\u7b7e\u540d\u79f0 \u662f\u5426\u652f\u6301 \u8bf4\u660e RequestMapping \u662f \u4e0d\u5141\u8bb8\u5236\u5b9a\u591a\u4e2aPath\uff0c\u4e00\u4e2a\u63a5\u53e3\u53ea\u5141\u8bb8\u4e00\u4e2aPath\uff0c\u5fc5\u987b\u663e\u793a\u7684\u58f0\u660e method \u5c5e\u6027\uff0c\u53ea\u80fd\u5b9a\u4e49\u552f\u4e00\u4e00\u4e2a method GetMapping \u662f PutMapping \u662f PostMapping \u662f DeleteMapping \u662f PatchMapping \u662f RequestParam \u662f \u6ce8\u610f\u542b\u4e49\u4e0eSpring MVC\u4e0d\u540c\u3002Java Chassis \u8868\u793a query \u53c2\u6570\u3002 CookieValue \u662f PathVariable \u662f RequestHeader \u662f RequestBody \u662f \u76ee\u524d\u652f\u6301application/json\uff0cplain/text RequestPart \u662f \u7528\u4e8e\u6587\u4ef6\u4e0a\u4f20\u7684\u573a\u666f\uff0c\u5bf9\u5e94\u7684\u6807\u7b7e\u8fd8\u6709Part\u3001MultipartFile ResponseBody \u5426 \u8fd4\u56de\u503c\u7f3a\u7701\u90fd\u662f\u5728body\u8fd4\u56de ResponseStatus \u5426 \u53ef\u4ee5\u901a\u8fc7ApiResponse\u6307\u5b9a\u8fd4\u56de\u7684\u9519\u8bef\u7801 RequestAttribute \u662f \u6ce8\u610f\u542b\u4e49\u4e0eSpring MVC\u4e0d\u540c\u3002Java Chassis \u8868\u793a form \u53c2\u6570\u3002 SessionAttribute \u5426 Servlet\u534f\u8bae\u76f8\u5173\u7684\u6807\u7b7e MatrixVariable \u5426 ModelAttribute \u5426 ControllerAdvice \u5426 CrossOrigin \u5426 ExceptionHandler \u5426 InitBinder \u5426 <ul> <li>\u670d\u52a1\u58f0\u660e\u65b9\u5f0f</li> </ul> <p>Spring MVC\u4f7f\u7528<code>@RestController</code>\u58f0\u660e\u670d\u52a1\uff0c\u800cServiceComb\u4f7f\u7528<code>@RestSchema</code>\u58f0\u660e\u670d\u52a1\uff0c\u5e76\u4e14\u9700 \u8981\u663e\u5f0f\u5730\u4f7f\u7528<code>@RequestMapping</code>\u58f0\u660e\u670d\u52a1\u8def\u5f84\uff0c\u4ee5\u533a\u5206\u8be5\u670d\u52a1\u662f\u91c7\u7528Spring MVC\u7684\u6807\u7b7e\u8fd8\u662f\u4f7f\u7528JAX RS\u7684\u6807\u7b7e\u3002</p> <pre><code> ```\n @RestSchema(schemaId = \"springmvcHello\")\n @RequestMapping(path = \"/springmvchello\", produces = MediaType.APPLICATION_JSON)\n public class SpringmvcHelloImpl implements Hello {\n ......\n }\n ```\n</code></pre> <p>servicecomb \u4e5f\u652f\u6301 <code>@RestController</code> \u58f0\u660e\uff0c\u7b49\u4ef7\u4e8e <code>@RestSchma(schemaId=\"\u670d\u52a1\u7684class\u540d\u79f0\")</code>\uff0c\u8fd9\u4e2a \u529f\u80fd\u53ef\u4ee5\u7b80\u5316\u7528\u6237\u5c06\u8001\u7684\u5e94\u7528\u6539\u9020\u4e3a servicecomb \u3002 \u5efa\u8bae\u7528\u6237\u4f7f\u7528<code>@RestSchema</code>\u663e\u5f0f\u58f0\u660eschemaId\uff0c\u5728\u7ba1\u7406 \u63a5\u53e3\u57fa\u672c\u7684\u914d\u7f6e\u9879\u7684\u65f6\u5019\uff0c\u66f4\u52a0\u76f4\u89c2\u3002</p> <p>\u6ce8\u610f\uff1a\u5982\u679c\u4e0d\u5e0c\u671bJava-Chassis\u626b\u63cf<code>@RestController</code>\u6ce8\u89e3\u4f5c\u4e3aREST\u63a5\u53e3\u7c7b\u5904\u7406\uff0c\u9700\u8981\u589e\u52a0\u914d\u7f6e <code>servicecomb.provider.rest.scanRestController=false</code> \u4ee5\u5173\u95ed\u6b64\u529f\u80fd\u3002</p> <ul> <li>\u6570\u636e\u7c7b\u578b\u652f\u6301</li> </ul> <p>Spring \u6280\u672f\u5b9e\u73b0\u7684 Spring MVC\uff0c\u53ef\u4ee5\u5728\u670d\u52a1\u5b9a\u4e49\u4e2d\u4f7f\u7528\u591a\u79cd\u6570\u636e\u7c7b\u578b\uff0c\u53ea\u8981\u8fd9\u79cd\u6570\u636e\u7c7b\u578b\u80fd\u591f\u88abjson\u5e8f\u5217\u5316\u548c \u53cd\u5e8f\u5217\u5316\u3002\u6bd4\u5982\uff1a</p> <pre><code> ```\n // \u62bd\u8c61\u7c7b\u578b\n public void postData(@RequestBody Object data)\n // \u63a5\u53e3\u5b9a\u4e49\n public void postData(@RequestBody IPerson interfaceData)\n // \u6ca1\u6307\u5b9a\u7c7b\u578b\u7684\u6cdb\u578b\n public void postData(@RequestBody Map rawData)\n ```\n</code></pre> <p>Spring \u6280\u672f\u65e9\u671f\u90fd\u662f\u57fa\u4e8e JSP/Servlet \u534f\u8bae\u6807\u51c6\u7684\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u76f8\u5173\u7684 context \u53c2\u6570\uff0c\u6bd4\u5982\uff1a</p> <pre><code> ```\n // \u5177\u4f53\u534f\u8bae\u76f8\u5173\u7684\u7c7b\u578b\n public void postData(HttpServletRequest rquest, HttpServletResponse response)\n ```\n</code></pre> <p>servicecomb \u5bf9\u4e8e\u6570\u636e\u7c7b\u578b\u5b58\u5728\u4e00\u5b9a\u7684\u9650\u5236\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u63a5\u53e3\u3001\u62bd\u8c61\u7c7b\u7b49\u6570\u636e\u7c7b\u578b\u5b9a\u4e49\u53c2\u6570\uff0c\u867d\u7136 servicecomb \u652f\u6301\u4f7f\u7528 Object \u8fd9\u4e2a\u7279\u6b8a\u7684\u7c7b\u578b\u6765\u5904\u7406\u7c7b\u578b\u65e0\u6cd5\u786e\u5b9a\u7684\u60c5\u51b5\uff0c\u4f46\u662f\u5efa\u8bae\u5c3d\u53ef\u80fd\u5c11\u4f7f\u7528\uff0c\u4f7f\u7528 Object \u4f5c\u4e3a\u7c7b\u578b\uff0c \u8fd0\u884c\u65f6\u7684\u7c7b\u578b\u4e0d\u786e\u5b9a\uff0c\u53ef\u80fd\u7ed9\u5ba2\u6237\u7aef\u4ee3\u7801\u7684\u4e66\u5199\u5e26\u6765\u4e00\u5b9a\u9ebb\u70e6\u3002</p> <p>servicecomb \u4e5f\u652f\u6301\u4e00\u4e9b context \u53c2\u6570\uff0c \u53c2\u8003\u4f7f\u7528 Context \u53c2\u6570 \u3002\u4f46\u662f\u7531\u4e8e servicecomb \u9ed8\u8ba4\u7684\u8fd0\u884c\u73af\u5883\u5e76\u4e0d\u662f JSP/Servlet \u534f\u8bae \u73af\u5883\uff0c\u56e0\u6b64\u4e0d\u80fd\u76f4\u63a5\u4f7f\u7528 <code>HttpServletRequest</code> \u548c <code>HttpServletResponse</code>\u3002 </p> <p>ServiceComb\u5728\u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u65b9\u9762\u7684\u66f4\u591a\u8bf4\u660e\uff0c\u8bf7\u53c2\u8003\uff1a \u63a5\u53e3\u5b9a\u4e49\u548c\u6570\u636e\u7c7b\u578b</p> <ul> <li>\u5176\u4ed6</li> </ul> <p>\u66f4\u591a\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u78b0\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u53c2\u8003\u6848\u4f8b\u3002\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u5b58\u5728\u7591\u95ee\uff0c\u4e5f\u53ef\u4ee5\u5728\u8fd9\u91cc\u8fdb\u884c\u63d0\u95ee\u3002</p>"},{"location":"build-provider/springmvc.html#http-header","title":"\u5728\u54cd\u5e94\u4e2d\u5305\u542b HTTP header","text":"<p>\u53ef\u4ee5\u6709\u591a\u79cd\u65b9\u5f0f\u5728\u54cd\u5e94\u4e2d\u5305\u542b HTTP header\uff0c \u4e0b\u9762\u4ee3\u7801\u5c55\u793a\u4e86\u4f7f\u7528 ResponseEntity \u5305\u542b HTTP header\u3002 \u9700\u8981\u6ce8\u610f \u4f7f\u7528 @ResponseHeaders \u58f0\u660e\u8fd4\u56de\u7684 header \u4fe1\u606f\u3002 \u5305\u542b\u4e86 @ResponseHeaders \u4ee5\u540e\uff0c \u63a5\u53e3\u751f\u6210\u7684\u5951\u7ea6\u4e2d\uff0c\u4e5f\u53ef\u4ee5 \u770b\u5230\u5bf9\u5e94\u7684 header \u53c2\u6570\u3002</p> <pre><code> @ResponseHeaders({@ResponseHeader(name = \"h1\", response = String.class),\n @ResponseHeader(name = \"h2\", response = String.class)})\n @RequestMapping(path = \"/responseEntity\", method = RequestMethod.POST)\n public ResponseEntity&lt;Date&gt; responseEntity(InvocationContext c1, \n @RequestAttribute(\"date\") Date date) {\n HttpHeaders headers = new HttpHeaders();\n headers.add(\"h1\", \"h1v \" + c1.getContext().get(Const.SRC_MICROSERVICE));\n\n InvocationContext c2 = ContextUtils.getInvocationContext();\n headers.add(\"h2\", \"h2v \" + c2.getContext().get(Const.SRC_MICROSERVICE));\n\n return new ResponseEntity&lt;&gt;(date, headers, HttpStatus.ACCEPTED);\n }\n</code></pre> <p>\u4e5f\u53ef\u4ee5\u4f7f\u7528 Response \u5bf9\u8c61\u8fd4\u56de HTTP header\uff0c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code> @ApiResponse(code = 202, response = User.class, message = \"\")\n @ResponseHeaders({@ResponseHeader(name = \"h1\", response = String.class),\n @ResponseHeader(name = \"h2\", response = String.class)})\n @RequestMapping(path = \"/cseResponse\", method = RequestMethod.GET)\n public Response cseResponse(InvocationContext c1) {\n Response response = Response.createSuccess(Status.ACCEPTED, new User());\n Headers headers = response.getHeaders();\n headers.addHeader(\"h1\", \"h1v \" + c1.getContext().get(Const.SRC_MICROSERVICE));\n\n InvocationContext c2 = ContextUtils.getInvocationContext();\n headers.addHeader(\"h2\", \"h2v \" + c2.getContext().get(Const.SRC_MICROSERVICE));\n\n return response;\n }\n</code></pre> <p>\u8fd9\u4e2a\u793a\u4f8b\u4ee3\u7801\u8fd8\u901a\u8fc7 @ApiResponse \u6307\u5b9a\u4e86\u8fd4\u56de 202 \u9519\u8bef\u7801\u53ca\u5176\u7c7b\u578b\uff0c \u8fd9\u4e2a\u54cd\u5e94\u503c\u4f1a\u5728\u5951\u7ea6\u4f53\u73b0\u3002</p> <p>\u6ce8\u610f: HIGHWAY \u534f\u8bae\u4e0d\u652f\u6301\u6307\u5b9a\u8fd4\u56de\u9519\u8bef\u7801\u548c\u7c7b\u578b\u3002\u9700\u8981\u540c\u65f6\u4f7f\u7528 HIGHWAY \u548c REST \u8bbf\u95ee\u7684\u63a5\u53e3\uff0c \u8bf7\u52ff\u4f7f\u7528\u3002 </p>"},{"location":"build-provider/springmvc.html#string-body","title":"\u6307\u5b9a String \u7c7b\u578b body \u7f16\u7801\u65b9\u5f0f","text":"<p>\u4f7f\u7528 REST \u901a\u4fe1\u7684\u670d\u52a1\uff0c \u4e00\u822c\u91c7\u7528 json \u8fdb\u884c\u7f16\u89e3\u7801\u3002 String \u7c7b\u578b\u7684\u6570\u636e\uff0c \u7f16\u7801\u4e3a json \u7684\u65f6\u5019\uff0c\u5b58\u5728 \u53cc\u5f15\u53f7\u3002 \u6bd4\u5982 <code>abc</code> \u7f16\u7801\u4ee5\u540e\u4e3a <code>\"abc\"</code> \u3002 \u4f46\u662f Spring \u81ea\u8eab\u7684\u5b9e\u73b0\uff0c \u5c06 String \u7c7b\u578b\u7684\u6570\u636e\uff0c\u7f16\u7801 \u4e3a\u4e0d\u5e26\u53cc\u5f15\u53f7\u3002 \u4e3a\u4e86\u4fdd\u6301 Spring \u539f\u59cb\u5b9e\u73b0\u7684\u65b9\u5f0f\u517c\u5bb9\uff0c servicecomb \u63d0\u4f9b\u4e86 <code>RawJsonRequestBody</code> \u63a5\u6536 \u4e0d\u5e26\u53cc\u5f15\u53f7\u7684\u53c2\u6570\u3002 </p> <pre><code> @ResponseBody\n public String testRawJsonAnnotation(@RawJsonRequestBody String jsonInput) {\n return jsonInput;\n }\n</code></pre> <p>\u6216\u8005\u4f7f\u7528 MediaType.TEXT_PLAIN_VALUE, \u4e0d\u4f7f\u7528 MediaType.APPLICATION_JSON_VALUE</p> <pre><code> @RequestMapping(path = \"/textPlain\", method = RequestMethod.POST, \n consumes = MediaType.TEXT_PLAIN_VALUE)\n public String textPlain(@RequestBody String body) {\n return body;\n }\n</code></pre> <p>\u5982\u679c\u54cd\u5e94\u4e0d\u671f\u671b\u5e26\u53cc\u5f15\u53f7\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>produces = MediaType.TEXT_PLAIN_VALUE</code></p> <pre><code> @RequestMapping(path = \"/sayhi/compressed/{name}/v2\", \n method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE)\n public String sayHiForCompressed(@PathVariable(name = \"name\") String name) {\n return name;\n }\n</code></pre>"},{"location":"build-provider/springmvc.html#querypojo","title":"Query\u53c2\u6570\u805a\u5408\u4e3aPOJO\u5bf9\u8c61","text":"<p>SpringBoot\u652f\u6301\u5c06Java\u4e1a\u52a1\u63a5\u53e3\u4e2d\u7684\u591a\u4e2aquery\u53c2\u6570\u805a\u5408\u4e3a\u4e00\u4e2aPOJO\u7c7b\uff0cSpringBoot\u539f\u751f\u7528\u6cd5\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>@RequestMapping(\"/hello\")\npublic class HelloService {\n @RequestMapping(value = \"/sayHello\", method = RequestMethod.GET)\n public String sayHello(Person person) {\n System.out.println(\"sayHello is called, person = [\" + person + \"]\");\n return \"Hello, your name is \" + person.getName() + \", and age is \" + person.getAge();\n }\n}\n</code></pre> <p>\u5176\u4e2d\uff0c\u4f5c\u4e3a\u53c2\u6570\u7684<code>Person</code>\u7c7b\u662f\u4e00\u4e2a\u6807\u51c6\u7684JavaBean\uff0c\u5305\u542b\u5c5e\u6027<code>name</code>\u548c<code>age</code>\u3002\u5f53\u670d\u52a1\u63a5\u6536\u5230\u7684\u8bf7\u6c42\u65f6\uff0cSpringBoot\u4f1a\u5c06query\u53c2\u6570<code>name</code>\u548c<code>age</code>\u805a\u5408\u4e3aPerson\u5bf9\u8c61\u4f20\u5165\u4e1a\u52a1\u63a5\u53e3\u3002</p> <p>ServiceComb\u7684SpringMVC\u5f00\u53d1\u6a21\u5f0f\u73b0\u5728\u4e5f\u652f\u6301\u7c7b\u4f3c\u7684\u7528\u6cd5\uff0c\u8be5\u7528\u6cd5\u7684\u8981\u6c42\u5982\u4e0b\uff1a</p> <ol> <li>POJO\u53c2\u6570\u4e0a\u4e0d\u80fd\u6709Spring\u7684\u53c2\u6570\u6ce8\u89e3\uff0c\u5426\u5219ServiceComb\u4e0d\u4f1a\u5c06\u5176\u4f5c\u4e3a\u805a\u5408\u7684query\u53c2\u6570\u5bf9\u8c61\u5904\u7406\u3002</li> <li>\u4ec5\u652f\u6301\u805a\u5408query\u53c2\u6570</li> <li>POJO\u53c2\u6570\u7c7b\u4e2d\u7684\u5c5e\u6027\u540d\u4e0equery\u53c2\u6570\u540d\u9700\u8981\u4fdd\u6301\u4e00\u81f4</li> <li>POJO\u53c2\u6570\u4e2d\u4e0d\u652f\u6301\u590d\u6742\u7684\u5c5e\u6027\uff0c\u5982\u5176\u4ed6POJO\u5bf9\u8c61\u3001List\u7b49\u3002\u7528\u6237\u53ef\u4ee5\u5728\u8fd9\u4e9b\u590d\u6742\u7c7b\u578b\u6253\u4e0a<code>@JsonIgnore</code>\u6ce8\u89e3\u6765\u8ba9ServiceComb\u5ffd\u7565\u8fd9\u4e9b\u590d\u6742\u5c5e\u6027\u3002</li> <li>consumer\u7aef\u4e0d\u652f\u6301query\u53c2\u6570\u805a\u5408\u4e3aPOJO\u5bf9\u8c61\uff0c\u8c03\u7528\u670d\u52a1\u65f6\u4f9d\u7136\u8981\u6309\u7167\u5951\u7ea6\u53d1\u9001\u8bf7\u6c42\u3002\u5373provider\u7aef\u88ab\u805a\u5408\u7684POJO\u53c2\u6570\u5728\u5951\u7ea6\u4e2d\u4f1a\u88ab\u5c55\u5f00\u6210\u4e00\u7cfb\u5217\u7684query\u53c2\u6570\uff0cconsumer\u7aef\u9700\u8981\u5728provider\u63a5\u53e3\u65b9\u6cd5\u4e2d\u4f9d\u6b21\u5b9a\u4e49\u8fd9\u4e9bquery\u53c2\u6570\uff08RPC\u5f00\u53d1\u6a21\u5f0f\uff09\uff0c\u6216\u5728\u53d1\u9001\u8bf7\u6c42\u65f6\u586b\u5165\u8fd9\u4e9bquery\u53c2\u6570\uff08RestTemplate\u5f00\u53d1\u6a21\u5f0f\uff09\u3002</li> </ol>"},{"location":"build-provider/springmvc.html#_2","title":"\u4ee3\u7801\u793a\u4f8b","text":""},{"location":"build-provider/springmvc.html#provider","title":"Provider\u7aef\u5f00\u53d1\u670d\u52a1","text":"<ul> <li>Provider\u7aef\u4e1a\u52a1\u63a5\u53e3\u4ee3\u7801\uff1a</li> </ul> <pre><code> @RestSchema(schemaId = \"helloService\")\n @RequestMapping(\"/hello\")\n public class HelloService {\n @RequestMapping(value = \"/sayHello\", method = RequestMethod.GET)\n public String sayHello(Person person) {\n System.out.println(\"sayHello is called, person = [\" + person + \"]\");\n return \"Hello, your name is \" + person.getName() + \", and age is \" + person.getAge();\n }\n }\n</code></pre> <ul> <li>POJO\u53c2\u6570\u5bf9\u8c61\u5b9a\u4e49\uff1a</li> </ul> <pre><code> public class Person {\n private String name;\n private int age;\n @JsonIgnore // \u590d\u6742\u5c5e\u6027\u9700\u8981\u6807\u8bb0@JsonIgnore\uff0c\u5426\u5219\u542f\u52a8\u65f6\u4f1a\u62a5\u9519\n private List&lt;Person&gt; children;\n }\n</code></pre> <ul> <li>\u63a5\u53e3\u5951\u7ea6\uff1a</li> </ul> <pre><code># \u5ffd\u7565\u5951\u7ea6\u7684\u5176\u4ed6\u90e8\u5206\nbasePath: \"/hello\"\npaths:\n /sayHello:\n get:\n operationId: \"sayHello\"\n parameters:\n # Person\u7c7b\u7684name\u5c5e\u6027\u548cage\u5c5e\u6027\u4f5c\u4e3a\u5951\u7ea6\u4e2d\u7684query\u53c2\u6570\n - name: \"name\"\n in: \"query\"\n required: false\n type: \"string\"\n - name: \"age\"\n in: \"query\"\n required: false\n type: \"integer\"\n format: \"int32\"\n responses:\n 200:\n description: \"response of 200\"\n schema:\n type: \"string\"\n</code></pre>"},{"location":"build-provider/springmvc.html#consumer","title":"Consumer\u7aef\u8c03\u7528\u670d\u52a1","text":"<p>consumer\u7aefRPC\u5f00\u53d1\u6a21\u5f0f\uff1a</p> <ul> <li>Provider\u63a5\u53e3\u5b9a\u4e49</li> </ul> <pre><code>public interface HelloServiceIntf {\n String sayHello(String name, int age);\n}\n</code></pre> <ul> <li>\u8c03\u7528\u4ee3\u7801</li> </ul> <pre><code>String result = helloService.sayHello(\"Bob\", 22); // result\u7684\u503c\u4e3a\"Hello, your name is Bob, and age is 22\"\n</code></pre> <ul> <li>consumer\u7aefRestTemplate\u5f00\u53d1\u6a21\u5f0f\uff1a</li> </ul> <pre><code>String result = restTemplate.getForObject(\n \"cse://provider-service/hello/sayHello?name=Bob&amp;age=22\",\n String.class); // \u8c03\u7528\u6548\u679c\u4e0eRPC\u65b9\u5f0f\u76f8\u540c\n</code></pre>"},{"location":"build-provider/swagger-annotation.html","title":"\u4f7f\u7528 Swagger \u6ce8\u89e3","text":"<p>\u91c7\u7528 Spring MVC \u6216\u8005 JAX RS \u6ce8\u89e3\u5df2\u7ecf\u80fd\u591f\u63cf\u8ff0\u5927\u90e8\u5206\u5e38\u7528\u7684\u5951\u7ea6\u4fe1\u606f\uff0c\u4f46\u662f\u4ecd\u7136\u4e0d\u8db3\u4ee5\u63cf\u8ff0\u6240\u6709\u5951\u7ea6\u4fe1\u606f\u3002\u53ef\u4ee5\u6df7\u5408 \u4f7f\u7528 Swagger \u6ce8\u89e3\uff0c\u8fdb\u4e00\u6b65\u8865\u5145\u5951\u7ea6\u4fe1\u606f\uff0c\u4f7f\u5f97\u5951\u7ea6\u4fe1\u606f\u66f4\u52a0\u5b8c\u6574\u3002\u5f53 Spring MVC \u6216\u8005 JAR RS \u6ce8\u89e3\u63cf\u8ff0\u7684\u4fe1\u606f\u4e0e Swagger \u6ce8\u89e3\u63cf\u8ff0\u7684\u4fe1\u606f\u91cd\u590d\u65f6\uff0c\u4ee5 Swagger \u6ce8\u89e3\u63cf\u8ff0\u7684\u4fe1\u606f\u4e3a\u51c6\uff0c\u5373 Swagger \u6ce8\u89e3\u5177\u6709\u66f4\u9ad8\u7684\u4f18\u5148\u7ea7\u3002</p> <p>\u5173\u4e8eSwagger\u6ce8\u89e3\u7684\u542b\u4e49\uff0c\u53ef\u4ee5\u5728Swagger\u6ce8\u89e3\u6587\u6863\u4e2d\u627e\u5230\u5b98\u65b9\u8bf4\u660e\u3002\u53ef\u4ee5\u5bf9 \u7167\u8be5\u5b98\u65b9\u6587\u6863\u4e0e\u672c\u8bf4\u660e\u6765\u4e86\u89e3\u5982\u4f55\u5728ServiceComb\u6846\u67b6\u4e0b\u4f7f\u7528\u6ce8\u89e3\u6307\u5b9aSwagger\u5951\u7ea6\u7684\u5404\u9879\u5c5e\u6027\u3002</p>"},{"location":"build-provider/swagger-annotation.html#api","title":"<code>@Api</code>","text":"<p><code>@Api</code>\u4f5c\u7528\u4e8e\u7c7b\u7ea7\u522b\uff0c\u5728Swagger\u5b98\u65b9\u63cf\u8ff0\u4e2d\u662f\u7528\u4e8e\u5c06\u4e00\u4e2aClass\u6807\u6ce8\u4e3a\u4e00\u4e2aSwagger\u8d44\u6e90\u3002\u4f46\u8be5\u6ce8\u89e3 \u5728ServiceComb\u4e2d\u4e0d\u662f\u5fc5\u987b\u7684\uff0cServiceComb\u53ef\u4ee5\u6839\u636e<code>@RestSchema</code>\u548c<code>@RpcSchema</code>\u786e\u5b9a\u9700\u8981\u4ece\u54ea\u4e9b \u7c7b\u4e2d\u89e3\u6790\u51faSwagger\u5951\u7ea6\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e tags string \u8bbe\u7f6e\u5f53\u524dClass\u4e0b\u5b9a\u4e49\u7684operation\u7684\u9ed8\u8ba4tag\u503c consumes string \u6307\u5b9a\u5951\u7ea6\u7ea7\u522b\u7684\u8bf7\u6c42\u4f53\u6570\u636e\u683c\u5f0f\uff0c\u53ef\u4ee5\u4f7f\u7528\u9017\u53f7\u5206\u9694\u6307\u5b9a\u591a\u4e2a produces string \u6307\u5b9a\u5951\u7ea6\u7ea7\u522b\u7684\u54cd\u5e94\u4f53\u6570\u636e\u683c\u5f0f\uff0c\u53ef\u4ee5\u4f7f\u7528\u9017\u53f7\u5206\u9694\u6307\u5b9a\u591a\u4e2a"},{"location":"build-provider/swagger-annotation.html#swaggerdefinition","title":"<code>@SwaggerDefinition</code>","text":"<p>\u4f5c\u7528\u4e8e\u7c7b\u7ea7\u522b\uff0c\u7528\u4e8e\u5b9a\u4e49\u4e00\u4e2aSwagger\u8d44\u6e90\u4e2d\u7684\u4fe1\u606f\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e info.title string \u5951\u7ea6\u6587\u4ef6\u6807\u9898 info.description string \u63cf\u8ff0\u4fe1\u606f info.version string \u5951\u7ea6\u7248\u672c\u53f7 info.termsOfService string \u670d\u52a1\u6761\u6b3e info.contact string \u8054\u7cfb\u4fe1\u606f\uff0c\u5305\u542bname\u3001email\u3001url\u5c5e\u6027 info.license string \u8bb8\u53ef\u8bc1\u4fe1\u606f\uff0c\u5305\u542bname\u3001url\u5c5e\u6027 info.extensions string \u6269\u5c55\u4fe1\u606f consumes string \u63a5\u6536\u7684\u8bf7\u6c42\u683c\u5f0f produces string \u8fd4\u56de\u7684\u5e94\u7b54\u683c\u5f0f schemes SwaggerDefinition.Scheme \u53ef\u9009\u503c\u6709<code>HTTP/HTTPS/WS/WSS/DEFAULT</code> tags <code>@Tag</code> Tag\u5b9a\u4e49\uff0c@Tag\u5305\u542bname\u3001description\u3001externalDocs\u4e09\u4e2a\u5c5e\u6027 externalDocs <code>@externalDocs</code> \u5916\u90e8\u8bf4\u660e\u6587\u6863\u94fe\u63a5\uff0c\u5305\u542bvalue\u3001url\u4e24\u4e2a\u5c5e\u6027"},{"location":"build-provider/swagger-annotation.html#apioperation","title":"<code>@ApiOperation</code>","text":"<p>\u4f5c\u7528\u4e8e\u65b9\u6cd5\u7ea7\u522b\uff0c\u7528\u4e8e\u63cf\u8ff0\u4e00\u4e2aSwagger operation\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e value string \u65b9\u6cd5\u7684\u7b80\u8981\u8bf4\u660e\uff0c\u5bf9\u5e94\u4e8eSwagger\u5951\u7ea6operation\u7684<code>summary</code>\u5b57\u6bb5 notes string \u8be6\u7ec6\u4fe1\u606f\uff0c\u5bf9\u5e94\u4e8eSwagger\u5951\u7ea6operation\u7684<code>description</code>\u5b57\u6bb5 tags string \u6807\u6ce8operation\u7684\u6807\u7b7e code int \u54cd\u5e94\u6d88\u606f\u7684HTTP\u72b6\u6001\u7801 response Class&lt;?&gt; \u65b9\u6cd5\u8fd4\u56de\u503c\u7c7b\u578b responseContainer string \u5305\u88c5\u8fd4\u56de\u503c\u7684\u5bb9\u5668\u7c7b\u578b\uff0c\u53ef\u9009\u503c\u4e3a<code>List</code>\u3001<code>Set</code>\u3001<code>Map</code> responseHeaders <code>@ResponseHeader</code> \u54cd\u5e94\u6d88\u606f\u7684HTTP\u5934\uff0cServiceComb\u652f\u6301\u7684\u5c5e\u6027\u503c\u4e3a<code>name</code>\u3001<code>response</code>\u3001<code>responseContainer</code> consumes string \u6307\u5b9a\u8bf7\u6c42\u4f53\u7684\u6570\u636e\u683c\u5f0f produces string \u6307\u5b9a\u54cd\u5e94\u4f53\u7684\u6570\u636e\u683c\u5f0f protocols string \u8bbe\u7f6e\u53ef\u7528\u7684\u534f\u8bae\uff08schemes\uff09\uff0c\u53ef\u9009\u503c\u6709<code>http</code>\u3001<code>https</code>\u3001<code>ws</code>\u3001<code>wss</code>\uff0c\u9017\u53f7\u5206\u9694 httpMethod string \u8bbe\u7f6eHTTP\u65b9\u6cd5 hidden boolean \u662f\u5426\u9690\u85cf\u6b64\u65b9\u6cd5"},{"location":"build-provider/swagger-annotation.html#apiimplicitparam","title":"<code>@ApiImplicitParam</code>","text":"<p>\u4f5c\u7528\u4e8e\u65b9\u6cd5\u7ea7\u522b\uff0c\u7528\u4e8e\u8bf4\u660eSwagger\u6587\u6863\u4e2doperation\u7684\u53c2\u6570\u7684\u5c5e\u6027\u3002</p> <p>\u6ce8\u610f\uff1aServiceComb\u53ef\u4ee5\u6839\u636e\u4ee3\u7801\u548cSpringMVC\u3001JAX-RS\u7684\u6ce8\u89e3\u81ea\u52a8\u63a8\u65ad\u51fa\u53c2\u6570\u540d\u79f0\u3002\u5982\u679c<code>@ApiImplicitParam</code>\u914d\u7f6e\u7684\u53c2\u6570\u540d\u79f0\u4e0e\u81ea\u52a8\u63a8\u65ad\u7684\u53c2\u6570\u540d\u4e0d\u540c\uff0c\u5219\u5219\u8be5\u6ce8\u89e3\u914d\u7f6e\u7684\u53c2\u6570\u5c06\u88ab\u4f5c\u4e3a\u4e00\u4e2a\u65b0\u7684\u53c2\u6570\u52a0\u5165\u5230\u6ce8\u89e3\u6240\u5728\u7684operation\u4e2d\uff1b\u5426\u5219\u5c06\u8986\u76d6\u540c\u540d\u53c2\u6570\u7684\u5c5e\u6027\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e name string \u53c2\u6570\u540d\u79f0 value string \u53c2\u6570\u8bf4\u660e required boolean \u662f\u5426\u662f\u5fc5\u586b\u53c2\u6570 dataType string \u53c2\u6570\u6570\u636e\u7c7b\u578b paramType string \u53c2\u6570\u4f4d\u7f6e\uff0c\u6709\u6548\u7684\u53ef\u9009\u503c\u4e3apath/query/body/header/form allowableValues string \u53c2\u6570\u7684\u6709\u6548\u503c\u8303\u56f4 allowEmptyValue boolean \u662f\u5426\u5141\u8bb8\u7a7a\u503c allowMultiple boolean \u662f\u5426\u5141\u8bb8\u591a\u4e2a\u503c\uff08\u82e5\u4e3atrue\uff0c\u5219\u53ef\u4ee5\u5c06\u53c2\u6570\u4f5c\u4e3a\u6570\u7ec4\uff09 collectionFormat string \u4ee5\u4f55\u79cd\u683c\u5f0f\u6307\u5b9a\u53c2\u6570\u6570\u7ec4\uff0c\u5f53\u524dServiceComb\u652f\u6301\u7684\u503c\u4e3a<code>csv/multi</code> defaultValue string \u53c2\u6570\u9ed8\u8ba4\u503c example string \u4e00\u4e2a\u975ebody\u53c2\u6570\u7684\u793a\u4f8b\u503c format string \u5141\u8bb8\u7528\u6237\u81ea\u5b9a\u4e49\u6570\u636e\u683c\u5f0f\uff0c\u8be6\u60c5\u53c2\u89c1Swagger\u5b98\u65b9\u6587\u6863"},{"location":"build-provider/swagger-annotation.html#apiimplicitparams","title":"<code>@ApiImplicitParams</code>","text":"<p><code>@ApiImplicitParams</code>\u4f5c\u7528\u4e8e\u65b9\u6cd5\u3001\u7c7b\u7ea7\u522b\uff0c\u7528\u4e8e\u6279\u91cf\u6307\u5b9a\u591a\u4e2a<code>@ApiImplicitParam</code>\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e value <code>@ApiImplicitParam</code> \u53c2\u6570\u5b9a\u4e49"},{"location":"build-provider/swagger-annotation.html#apiresponse","title":"<code>@ApiResponse</code>","text":"<p>\u7528\u4e8e\u63cf\u8ff0\u8fd4\u56de\u6d88\u606f\u7684HTTP\u72b6\u6001\u7801\u6240\u8868\u8fbe\u7684\u542b\u4e49\u3002\u901a\u5e38<code>@ApiOperation</code>\u53ef\u4ee5\u8868\u793a\u4e00\u4e2a\u6b63\u5e38\u60c5\u51b5\u8fd4\u56de\u6d88\u606f\u7684HTTP\u72b6\u6001\u7801\uff0c\u5176\u4ed6\u60c5\u5f62\u4e0b\u7684HTTP\u72b6\u6001\u7801\u7531\u672c\u6ce8\u89e3\u63cf\u8ff0\u3002\u6839\u636eSwagger\u5b98\u65b9\u6587\u6863\u7684\u63cf\u8ff0\uff0c\u672c\u6ce8\u89e3\u4e0d\u5e94\u8be5\u76f4\u63a5\u7528\u4e8e\u65b9\u6cd5\u7ea7\u522b\uff0c\u800c\u5e94\u8be5\u88ab\u5305\u542b\u5728<code>@ApiResponses</code>\u4e2d\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e code int \u8fd4\u56de\u6d88\u606f\u7684HTTP\u72b6\u6001\u7801 message string \u8fd4\u56de\u503c\u7684\u8bf4\u660e\u4fe1\u606f response Class&lt;?&gt; \u8fd4\u56de\u503c\u7684\u7c7b\u578b responseContainer string \u8fd4\u56de\u503c\u7684\u5305\u88c5\u5bb9\u5668\uff0c\u53ef\u9009\u503c\u4e3a<code>List/Set/Map</code> responseHeaders @ResponseHeader \u63cf\u8ff0\u4e00\u7ec4\u8fd4\u56de\u6d88\u606f\u7684HTTP\u5934\uff0cServiceComb\u652f\u6301\u7684<code>@ResponseHeader</code>\u7684\u5c5e\u6027\u6709<code>name</code>\u3001<code>description</code>\u3001<code>response</code>\u3001<code>responseContainer</code>"},{"location":"build-provider/swagger-annotation.html#apiresponses","title":"<code>@ApiResponses</code>","text":"<p>\u4f5c\u7528\u4e8e\u65b9\u6cd5\u3001\u7c7b\u7ea7\u522b\uff0c\u7528\u4e8e\u6307\u5b9a\u548c\u8bf4\u660e\u4e00\u7ec4\u8fd4\u56de\u503c\u3002</p> \u5c5e\u6027 \u7c7b\u578b \u8bf4\u660e value <code>@ApiResponse</code> \u8fd4\u56de\u6d88\u606f\u8bf4\u660e"},{"location":"build-provider/thread-pool.html","title":"\u7ebf\u7a0b\u6c60","text":"<p>\u7ebf\u7a0b\u6c60\u7528\u4e8e\u6267\u884c\u540c\u6b65\u6a21\u5f0f\u7684\u4e1a\u52a1\u903b\u8f91\uff0c\u7f51\u7edc\u6536\u53d1\u53careactive\u6a21\u5f0f\u7684\u4e1a\u52a1\u903b\u8f91\u5728 event-loop \u4e2d\u6267\u884c\uff0c\u4e0e\u7ebf\u7a0b\u6c60\u65e0\u5173\u3002 \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c Consumer \u548c Provider \u7684 \u4e1a\u52a1\u903b\u8f91\u4ee3\u7801\u7684\u6267\u884c\u90fd\u662f\u5728\u7ebf\u7a0b\u6c60\u91cc\u9762\uff0c Edge Service \u7684\u4e1a\u52a1\u903b\u8f91\u6267\u884c\u5728 event-loop \u91cc\u9762\u3002 </p> <p>Java Chassis \u63d0\u4f9b\u4e86\u4e00\u4e2a\u5168\u5c40\u7684\u5185\u7f6e\u7ebf\u7a0b\u6c60\uff0c \u5982\u679c\u4e1a\u52a1\u6709\u7279\u6b8a\u7684\u9700\u6c42\uff0c\u53ef\u4ee5\u6307\u5b9a\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u5168\u5c40\u7ebf\u7a0b\u6c60\uff0c\u5e76\u4e14\u53ef\u4ee5\u6839 \u636e schemaId \u6216 operationId \u6307\u5b9a\u5404\u81ea\u4f7f\u7528\u72ec\u7acb\u7684\u7ebf\u7a0b\u6c60\uff0c\u5b9e\u73b0\u9694\u79bb\u4ed3\u7684\u6548\u679c\u3002 </p>"},{"location":"build-provider/thread-pool.html#_2","title":"\u5b9a\u5236\u7ebf\u7a0b\u6c60","text":"<ul> <li>\u5b9e\u73b0\u7ebf\u7a0b\u6c60 \u4e0b\u9762\u7684\u65b9\u6cd5\u4efb\u9009\u5176\u4e00\u5373\u53ef<ul> <li>\u5b9e\u73b0<code>java.util.concurrent.Executor</code>\u63a5\u53e3\uff0c \u4e3a\u4e86\u652f\u6301\u4f18\u96c5\u9000\u51fa\uff0c\u5982\u679c\u5185\u90e8\u7ebf\u7a0b\u672a\u8bbe\u7f6e\u4e3adaemon\u7ebf\u7a0b\uff0c\u5219\u8fd8\u9700\u8981\u5b9e\u73b0<code>java.io.Closeable</code>\u63a5\u53e3\uff0c\u8d1f\u8d23\u9500\u6bc1\u7ebf\u7a0b\u6c60</li> <li>\u5b9e\u73b0<code>java.util.concurrent.ExecutorService</code>\u63a5\u53e3</li> </ul> </li> <li>\u5c06\u5b9e\u73b0\u7684\u7ebf\u7a0b\u6c60\u58f0\u660e\u4e3a spring bean</li> <li>\u542f\u7528\u7ebf\u7a0b\u6c60 \u5047\u8bbe\u65b0\u7ebf\u7a0b\u6c60bean id\u4e3acustom-executor</li> <li>\u66ff\u6362\u5168\u5c40\u7ebf\u7a0b\u6c60\uff1a<code>servicecomb.executors.default: custom-executor</code></li> <li>\u6307\u5b9aschema\u4e13\u7528\u7684\u7ebf\u7a0b\u6c60: <code>servicecomb.executors.Provider.${microserviceId}.${schemaId}: custom-executor</code></li> <li>\u6307\u5b9aoperation\u4e13\u7528\u7684\u7ebf\u7a0b\u6c60: <code>servicecomb.executors.Provider.${microserviceId}.${schemaId}.${operationId}: custom-executor</code></li> <li>\u6307\u5b9amicroservice\u4e13\u7528\u7684\u7ebf\u7a0b\u6c60: <code>servicecomb.executors.Provider.${microserviceId}: custom-executor</code> \u5176\u4e2dmicroserviceId\u4e3a\u53ef\u9009\u9879\uff0c\u5728edge service\u4e2d\u7528\u4ee5\u533a\u5206\u4e0d\u540c\u7684microservice</li> </ul>"},{"location":"build-provider/thread-pool.html#java-chassis","title":"Java Chassis \u5185\u7f6e\u7ebf\u7a0b\u6c60","text":"<p>Java Chassis\u63d0\u4f9b\u4e86\u4e24\u4e2a\u5185\u7f6e\u7684\u7ebf\u7a0b\u6c60\uff0c<code>servicecomb.executor.groupThreadPool</code> \u548c <code>servicecomb.executor.reactive</code>\u3002 \u524d\u8005 \u662f\u540c\u6b65\u7ebf\u7a0b\u6c60\uff0c\u5728Consumer\u548cProvider\u9ed8\u8ba4\u542f\u7528\uff1b\u540e\u8005\u662f\u5f02\u6b65\u7ebf\u7a0b\u6c60\uff0c\u5728Edge Service\u9ed8\u8ba4\u542f\u7528\u3002 </p>"},{"location":"build-provider/thread-pool.html#_3","title":"\u540c\u6b65\u7ebf\u7a0b\u6c60","text":"<p>\u4e00\u822c\u7684\u7ebf\u7a0b\u6c60\u90fd\u662f\u6240\u6709\u7ebf\u7a0b\u5171\u4eab\u4e00\u4e2a\u4efb\u52a1\u961f\u5217\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u7f51\u7edc\u7ebf\u7a0b\u9700\u8981\u5411\u540c\u4e00\u4e2a\u961f\u5217\u7533\u8bf7\u8bf7\u6c42\u5165\u961f\uff0c\u7ebf\u7a0b\u6c60\u4e2d\u7684\u6240\u6709\u7ebf\u7a0b\u9700\u8981\u4ece\u540c\u4e00\u4e2a\u961f\u5217\u4e2d\u62a2\u4efb\u52a1\u6267\u884c\uff0c\u5bf9\u4e8e\u9ad8\u541e\u5410\u7684\u573a\u666f\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u7ade\u4e89\u51b2\u7a81\uff0c\u5f62\u6210\u6027\u80fd\u74f6\u9888 \u6240\u4ee5\uff0c\u4e3a\u4e86\u63d0\u5347\u6027\u80fd\uff0cJava Chassis\u5185\u7f6e\u7ebf\u7a0b\u6c60\u5b9e\u9645\u662f\u771f\u6b63\u7ebf\u7a0b\u6c60\u7684\u5305\u88c5\uff0c\u5141\u8bb8\u5728\u5176\u5185\u90e8\u914d\u7f6e\u591a\u7ec4\u7ebf\u7a0b\u6c60\uff0c\u4e14\u6bcf\u4e2a\u7f51\u7edc\u7ebf\u7a0b\u7ed1\u5b9a\u4e00\u7ec4\u7ebf\u7a0b\u6c60\uff0c\u4ee5\u51cf\u5c0f\u7ade\u4e89\u51b2\u7a81 </p> <ul> <li>1.2.0\u4e4b\u524d\u7684\u7248\u672c</li> </ul> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 servicecomb.executor.default.group 2 \u521b\u5efa\u51e0\u7ec4\u7ebf\u7a0b\u6c60 servicecomb.executor.default.thread-per-group CPU\u6570 \u6bcf\u7ec4\u7ebf\u7a0b\u6c60\u7684\u7ebf\u7a0b\u6570 <ul> <li>\u5927\u4e8e\u7b49\u4e8e1.2.0\u7684\u7248\u672c</li> </ul> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 servicecomb.executor.default.group 2 \u521b\u5efa\u51e0\u7ec4\u7ebf\u7a0b\u6c60 servicecomb.executor.default.thread-per-group 100 \u6bcf\u7ec4\u7ebf\u7a0b\u6c60\u7684\u6700\u5927\u7ebf\u7a0b\u6570Deprecated\uff0c\u65b0\u540d\u5b57\uff1amaxThreads-per-group servicecomb.executor.default.coreThreads-per-group 25 \u6bcf\u7ec4\u7ebf\u7a0b\u6c60\u7684\u6700\u5c0f\u7ebf\u7a0b\u6570\u7ebf\u7a0b\u4e0d\u4f1a\u9884\u521b\u5efa\uff0c\u800c\u662f\u5df2\u7ecf\u521b\u5efa\u540e\uff0c\u53ea\u6709\u5927\u4e8e\u8fd9\u4e2a\u503c\u7684\u7ebf\u7a0b\uff0c\u624d\u4f1a\u56e0idle\u800c\u9500\u6bc1 servicecomb.executor.default.maxThreads-per-group 100 \u6bcf\u7ec4\u7ebf\u7a0b\u6c60\u7684\u6700\u5927\u7ebf\u7a0b\u6570 servicecomb.executor.default.maxIdleSecond-per-group 60 \u6bcf\u7ec4\u7ebf\u7a0b\u6c60\u4e2d\u8d85\u8fc7coreThreads-per-group\u7684\u7ebf\u7a0b\uff0c\u5982\u679cidle\u8d85\u65f6\uff0c\u5219\u4f1a\u9500\u6bc1\u8be5\u7ebf\u7a0b servicecomb.executor.default.maxQueueSize-per-group Integer.MAX_VALUE \u6bcf\u7ec4\u7ebf\u7a0b\u6c60\u4e2d\u4efb\u52a1\u961f\u5217\u7684\u6700\u5927\u957f\u5ea6 servicecomb.rest.server.requestWaitInPoolTimeout 30000 \u5728\u540c\u6b65\u7ebf\u7a0b\u4e2d\u6392\u961f\u7b49\u5f85\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2"},{"location":"build-provider/thread-pool.html#_4","title":"\u5f02\u6b65\u7ebf\u7a0b\u6c60","text":"<p>\u6240\u8c13\u7684\u5f02\u6b65\u7ebf\u7a0b\u6c60\uff0c\u5b9e\u9645\u4e0a\u662f\u6ca1\u6709\u63d0\u4f9b\u989d\u5916\u7684\u7ebf\u7a0b\u6c60\u3002 \u6240\u6709\u7684\u4e1a\u52a1\u903b\u8f91\u76f4\u63a5\u5728 event-loop \u7ebf\u7a0b\u6c60\u6267\u884c\u3002 \u4f7f\u7528\u5f02\u6b65\u7ebf\u7a0b\u6c60\uff0c\u4e1a\u52a1\u4ee3\u7801\u4e0d\u80fd\u591f\u5b58\u5728\u963b\u585e\u64cd\u4f5c\u3002 \u5e38\u89c1\u7684\u963b\u585e\u64cd\u4f5c\u5305\u62ec</p> <ul> <li>\u4f7f\u7528\u540c\u6b65API\uff0c\u8c03\u7528\u5176\u4ed6\u5fae\u670d\u52a1\uff0c\u6bd4\u5982 RestTemplate\u3001\u900f\u660eRPC\u7b49\u3002</li> <li>\u7279\u522b\u8017\u65f6\u7684\u4efb\u52a1\u3002\u6bd4\u5982\u7b49\u5f85IO\u3001\u7b49\u5f85\u9501\u3001Sleep\u7b49\u3002</li> </ul>"},{"location":"build-provider/transparent-rpc.html","title":"\u7528\u900f\u660eRPC\u5f00\u53d1\u5fae\u670d\u52a1","text":""},{"location":"build-provider/transparent-rpc.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u662f\u4e00\u79cd\u57fa\u4e8e\u63a5\u53e3\u548c\u63a5\u53e3\u5b9e\u73b0\u7684\u5f00\u53d1\u6a21\u5f0f\uff0c\u670d\u52a1\u7684\u5f00\u53d1\u8005\u4e0d\u9700\u8981\u4f7f\u7528Spring MVC\u548cJAX-RS\u6ce8\u89e3\u3002</p> <p>\u900f\u660eRPC\u4f8b\u5b50 \u63d0\u4f9b\u4e86\u4e00\u4e9b\u57fa\u7840\u7684\u4ee3\u7801\u793a\u4f8b\uff0c\u53ef\u4ee5\u4e0b\u8f7d\u4f7f\u7528\u3002</p>"},{"location":"build-provider/transparent-rpc.html#_2","title":"\u5f00\u53d1\u793a\u4f8b","text":"<p>\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u652f\u6301Spring xml\u914d\u7f6e\u548c\u6ce8\u89e3\u914d\u7f6e\u4e24\u79cd\u670d\u52a1\u53d1\u5e03\u65b9\u5f0f\uff0c\u901a\u8fc7Spring xml\u914d\u7f6e\u7684\u65b9\u5f0f\u5982\u4e0b\uff1a</p>"},{"location":"build-provider/transparent-rpc.html#1","title":"\u6b65\u9aa4 1\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3\u3002","text":"<p>\u6839\u636e\u5f00\u53d1\u4e4b\u524d\u5b9a\u4e49\u597d\u7684\u5951\u7ea6\uff0c\u7f16\u5199Java\u4e1a\u52a1\u63a5\u53e3\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>public interface Hello {\n String sayHi(String name);\n String sayHello(Person person);\n}\n\npublic interface Compute {\n int add(int a, int b);\n int multi(int a, int b);\n int sub(int a, int b);\n int divide(int a, int b);\n}\n\n</code></pre>"},{"location":"build-provider/transparent-rpc.html#2","title":"\u6b65\u9aa4 2\u5b9e\u73b0\u670d\u52a1","text":"<p>Hello\u7684\u670d\u52a1\u5b9e\u73b0\u5982\u4e0b\uff1a</p> <p>\u8bf4\u660e\uff1a \u6bcf\u4e00\u4e2a\u670d\u52a1\u63a5\u53e3\u90fd\u9700\u8981\u5b9a\u4e49\u4e00\u4e2aschema\u58f0\u660e\u3002</p> <ul> <li>\u5728\u63a5\u53e3Hello \u548c Compute \u7684\u5b9e\u73b0\u7c7b\u4e0a\u4f7f\u7528@RpcSchema\u6ce8\u89e3\u5b9a\u4e49schema\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a</li> </ul> <pre><code>@RpcSchema(schemaId = \"hello\")\npublic class HelloImpl implements Hello {\n @Override\n public String sayHi(String name) {\n return \"Hello \" + name;\n }\n\n @Override\n public String sayHello(Person person) {\n return \"Hello person \" + person.getName();\n }\n}\n\n@RpcSchema(schemaId = \"codeFirstCompute\")\npublic class CodeFirstComputeImpl implements Compute {\n @Override\n public int add(int a, int b) {\n return a + b;\n }\n\n @Override\n public int multi(int a, int b) {\n return a * b;\n }\n\n @Override\n public int sub(int a, int b) {\n return a - b;\n }\n\n @Override\n public int divide(int a, int b) {\n if (b != 0) {\n return a / b;\n }\n return 0;\n }\n}\n</code></pre>"},{"location":"build-provider/transparent-rpc.html#3","title":"\u6b65\u9aa4 3\u53d1\u5e03\u670d\u52a1","text":"<ul> <li>\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u65b9\u5f0f</li> </ul> <p>\u5728resources/META-INF/spring\u76ee\u5f55\u4e0b\u7684pojoHello.bean.xml\u6587\u4ef6\u4e2d\uff0c\u914d\u7f6eSpring\u8fdb\u884c\u670d\u52a1\u626b\u63cf\u7684base-package\uff0c\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\uff1a</p> <pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;beans xmlns=\" http://www.springframework.org/schema/beans \" xmlns:xsi=\" http://www.w3.org/2001/XMLSchema-instance \"\n xmlns:p=\" http://www.springframework.org/schema/p \" xmlns:util=\" http://www.springframework.org/schema/util \"\n xmlns:cse=\" http://www.huawei.com/schema/paas/cse/rpc \"\n xmlns:context=\" http://www.springframework.org/schema/context \"\n xsi:schemaLocation=\" http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.huawei.com/schema/paas/cse/rpc classpath:META-INF/spring/spring-paas-cse-rpc.xsd\"&gt;\n\n &lt;context:component-scan base-package=\"org.apache.servicecomb.samples.pojo.provider\"/&gt;\n&lt;/beans&gt;\n</code></pre>"},{"location":"build-provider/transparent-rpc.html#4","title":"\u6b65\u9aa4 4 \u542f\u52a8\u670d\u52a1","text":"<pre><code>public class PojoProviderMain {\n\n public static void main(String[] args) throws Exception {\n Log4jUtils.init();\n BeanUtils.init();\n }\n}\n</code></pre> <p>\u8bf4\u660e\uff1a \u4e0eSpring MVC\u5f00\u53d1\u6a21\u5f0f\u548cJAX-RS\u5f00\u53d1\u6a21\u5f0f\u4e0d\u540c\u7684\u662f\uff0c\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u4f7f\u7528\u7684\u6ce8\u89e3\u662f<code>@RpcSchema</code>\u800c\u975e<code>@RestSchema</code>\u3002</p>"},{"location":"build-provider/use-interface.html","title":"\u53ea\u53d1\u5e03interface\u7684\u65b9\u6cd5\u4e3a\u670d\u52a1\u63a5\u53e3","text":"<p>\u4e0d\u7ba1\u91c7\u7528 <code>JAX RS</code>, <code>Spring MVC</code>\uff0c \u8fd8\u662f\u91c7\u7528 <code>\u900f\u660eRPC</code> \u5f00\u53d1\uff0c java-chassis \u9ed8\u8ba4\u4f1a\u626b\u63cf\u5b9e\u73b0\u7c7b\u7684\u6240\u6709\u65b9\u6cd5\uff0c \u5c06 <code>public</code> \u65b9\u6cd5\u53d1\u5e03\u4e3a\u670d\u52a1\u63a5\u53e3\u3002 \u4ece 2.1.1 \u7248\u672c\u5f00\u59cb\uff0c \u589e\u52a0\u4e86 <code>schemaInterface</code> \u5c5e\u6027\uff0c \u5b9e\u73b0\u7c7b\u53ef\u4ee5\u901a\u8fc7 \u5b9e\u73b0 <code>schemaInterface</code> \u5bf9\u5e94\u7684\u63a5\u53e3\uff0c \u6700\u7ec8\u53ea\u6709 <code>schemaInterface</code> \u7684\u65b9\u6cd5\u53d1\u5e03\u4e3a\u670d\u52a1\u63a5\u53e3\u3002 </p>"},{"location":"build-provider/use-interface.html#jax-rs","title":"JAX RS \u7684\u4f8b\u5b50","text":"<p>\u9996\u5148\u5b9a\u4e49\u63a5\u53e3\uff1a</p> <pre><code>@Path(\"/jaxrs/schemaInterface\")\n@Produces(MediaType.APPLICATION_JSON)\npublic interface SchemeInterfaceJaxrs {\n @Path(\"/add\")\n @GET\n public int add(@Min(1) @RequestParam(\"a\") int a, @Min(1) @RequestParam(\"b\") int b);\n\n @Path(\"/interfaceModel\")\n @GET\n Page&lt;String&gt; interfaceModel(Page&lt;String&gt; model);\n}\n</code></pre> <p>\u5b9e\u73b0\u7c7b\u6307\u5b9a <code>schemaInterface</code>:</p> <pre><code>@RestSchema(schemaId = \"SchemeInterfaceJaxrs\", schemaInterface = SchemeInterfaceJaxrs.class)\npublic class SchemeInterfaceJaxrsImpl implements SchemeInterfaceJaxrs {\n @Override\n public int add(@Min(1) int a, @Min(1) int b) {\n return a + b;\n }\n\n public int reduce(int a, int b) {\n return a - b;\n }\n\n @Override\n public Page&lt;String&gt; interfaceModel(Page&lt;String&gt; model) {\n return model;\n }\n}\n</code></pre> <p>\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u53ea\u6709 <code>add</code> \u548c <code>interfaceModel</code> \u53d1\u5e03\u4e3a\u670d\u52a1\u63a5\u53e3\uff0c <code>reduce</code> \u4e0d\u4f1a\u53d1\u5e03\u4e3a\u670d\u52a1\u63a5\u53e3\u3002 \u5ba2\u6237\u7aef \u901a\u8fc7\u900f\u660e RPC \u7684\u65b9\u5f0f\u8bbf\u95ee\uff1a</p> <pre><code>public interface SchemeInterfaceJaxrs {\n int add(int a, int b);\n\n int reduce(int a, int b);\n\n Page&lt;String&gt; interfaceModel(Page&lt;String&gt; model);\n}\n\n\n@RpcReference(schemaId = \"SchemeInterfaceJaxrs\", microserviceName = \"jaxrs\")\nprivate SchemeInterfaceJaxrs jaxrs;\n\npublic void testAllTransport() throws Exception {\n TestMgr.check(3, jaxrs.add(1, 2));\n\n try {\n jaxrs.reduce(1, 3);\n TestMgr.failed(\"should throw exception\", new Exception());\n } catch (Exception e) {\n TestMgr.check(\n \"Consumer method org.apache.servicecomb.demo.jaxrs.client.SchemeInterfaceJaxrs:reduce \"\n + \"not exist in contract, microserviceName=jaxrs, schemaId=SchemeInterfaceJaxrs; \"\n + \"new producer not running or not deployed.\",\n e.getMessage());\n }\n}\n</code></pre> <p>\u8bbf\u95ee <code>reduce</code> \u4f1a\u629b\u51fa\u5f02\u5e38\uff0c \u8bbf\u95ee <code>add</code> \u80fd\u591f\u5f97\u5230\u6b63\u786e\u7684\u7ed3\u679c\u3002 </p>"},{"location":"build-provider/use-interface.html#spring-mvc-rpc","title":"Spring MVC \u548c \u900f\u660eRPC","text":"<p>\u8fd9\u4e24\u79cd\u65b9\u5f0f\u548c JAX RS \u7c7b\u4f3c\uff0c\u4e0d\u8be6\u7ec6\u4e3e\u4f8b\u4e86\u3002 \u4f7f\u7528 @RestSchema\uff0c @RpcSchema \u7684\u65f6\u5019\uff0c \u76f8\u5173\u7684 Annotation \u5fc5\u987b \u5728 schemaInterface \u58f0\u660e\uff0c \u5728\u5b9e\u73b0\u7c7b\u58f0\u660e\u65e0\u6548\uff0c\u8fd9\u4e9b Annotation \u5305\u62ec <code>JAX RS</code>, <code>Spring MVC</code> \u548c <code>Swagger \u6ce8\u89e3</code> \u3002 \u540c\u65f6\u9700\u8981\u6ce8\u610f\uff0c\u7531\u4e8e @Path, @RequestMapping \u8fd9\u4e9b Annotation \u53ea\u80fd\u5728 schemaInterface \u58f0\u660e, \u6bcf\u4e2a\u63a5\u53e3\u7684 URL \u5fc5\u987b\u552f\u4e00\uff0c\u6240\u4ee5\u8fd9\u4e2a\u529f\u80fd\u9650\u5236\u4e86\u4e00\u4e2a\u63a5\u53e3\u53ea\u80fd\u5b9a\u4e49\u4e00\u4e2a\u5b9e\u73b0\u7c7b\u3002 </p>"},{"location":"build-provider/definition/heartbeats.html","title":"Heartbeats","text":""},{"location":"build-provider/definition/heartbeats.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u5f53\u5fae\u670d\u52a1\u5b9e\u4f8b\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u540e\uff0c\u5fae\u670d\u52a1\u9700\u8981\u5b9a\u65f6\u5411\u670d\u52a1\u4e2d\u5fc3\u53d1\u9001\u5fc3\u8df3\u3002\u82e5\u670d\u52a1\u4e2d\u5fc3\u5728\u4e00\u5b9a\u65f6\u95f4\u5185\u6ca1\u6709\u6536\u5230\u5fc3\u8df3\u4fe1\u606f\uff0c\u5219\u4f1a\u6ce8\u9500\u6b64\u5b9e\u4f8b\u3002</p>"},{"location":"build-provider/definition/heartbeats.html#api","title":"\u6d89\u53caAPI","text":"<ul> <li><code>org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient</code>\uff1a\u670d\u52a1\u4e2d\u5fc3\u5ba2\u6237\u7aef</li> </ul>"},{"location":"build-provider/definition/heartbeats.html#_2","title":"\u914d\u7f6e\u8bf4\u660e","text":"<p><code>ServiceRegistryClient</code>\u63d0\u4f9b\u4e86\u53d1\u9001\u5fc3\u8df3\u7684\u65b9\u6cd5<code>heartbeat</code>\uff0c\u7528\u6237\u76f4\u63a5\u8c03\u7528\u5373\u53ef\uff0c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>public static void main(String[] args) throws Exception {\n // \u9996\u5148\u9700\u8981\u6ce8\u518c\u5fae\u670d\u52a1\u548c\u5b9e\u4f8b\u2026\u2026\n // \u53d1\u9001\u5fc3\u8df3\uff0c\u4e0d\u7136\u5b9e\u4f8b\u4f1a\u6d88\u5931\n while (true) {\n System.out.println(\"heartbeat sended:\" + client.heartbeat(service2.getServiceId(), instance.getInstanceId()));\n Thread.sleep(3000);\n }\n}\n</code></pre>"},{"location":"build-provider/definition/isolate-relationship.html","title":"Isolate relationship","text":""},{"location":"build-provider/definition/isolate-relationship.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u8005\u9700\u8981\u4e86\u89e3\u672c\u5fae\u670d\u52a1\u80fd\u591f\u53d1\u73b0\u90a3\u4e9b\u5176\u4ed6\u670d\u52a1\u7684\u5b9e\u4f8b\u3002ServiceComb\u63d0\u4f9b\u4e86\u5206\u5c42\u6b21\u7684\u5b9e\u4f8b\u9694\u79bb\u3002</p>"},{"location":"build-provider/definition/isolate-relationship.html#_2","title":"\u5fae\u670d\u52a1\u5b9e\u4f8b\u5206\u5c42\u7ba1\u7406","text":"<p>\u8981\u4e86\u89e3\u5b9e\u4f8b\u95f4\u7684\u9694\u79bb\u5c42\u6b21\uff0c\u9996\u5148\u9700\u8981\u4e86\u89e3ServiceComb\u5b9a\u4e49\u7684\u4e00\u4e2a\u4f53\u7cfb\u5b8c\u5907\u7684\u5fae\u670d\u52a1\u7cfb\u7edf\u7ed3\u6784\uff1a</p> <p></p> <p>\u5728\u5fae\u670d\u52a1\u7cfb\u7edf\u7ed3\u6784\u4e2d\uff0c\u9876\u5c42\u662f\u201c\u9879\u76ee\u201d\uff0c\u5728\u9879\u76ee\u4e0b\u5206\u4e3a\u591a\u4e2a\u79df\u6237\uff0c\u79df\u6237\u4e2d\u5305\u542b\u591a\u4e2a\u5e94\u7528\uff0c\u800c\u6bcf\u4e2a\u5e94\u7528\u7531\u5305\u542b\u591a\u4e2a\u73af\u5883\uff0c\u5373\u6d4b\u8bd5\u548c\u751f\u4ea7\u73af\u5883\u53ef\u4ee5\u5206\u5f00\u3002\u5728\u67d0\u4e2a\u7279\u5b9a\u5e94\u7528\u7684\u7279\u5b9a\u73af\u5883\u4e2d\uff0c\u5305\u542b\u591a\u4e2a\u5fae\u670d\u52a1\uff0c\u800c\u4e00\u4e2a\u5fae\u670d\u52a1\u53c8\u53ef\u4ee5\u540c\u65f6\u5b58\u5728\u591a\u4e2a\u7248\u672c\u3002\u4ee5\u4e0a\uff0c\u662f\u6240\u6709\u9759\u6001\u5143\u6570\u636e\u7684\u8303\u7574\uff0c\u67d0\u4e2a\u7279\u5b9a\u670d\u52a1\u7684\u7279\u5b9a\u7248\u672c\u5219\u5305\u542b\u591a\u4e2a\u5728\u8fd0\u884c\u65f6\u6ce8\u518c\u4e0a\u6765\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u56e0\u4e3a\u670d\u52a1\u5b9e\u4f8b\u7684\u4fe1\u606f\u5728\u8fd0\u884c\u65f6\u968f\u7740\u7cfb\u7edf\u7684\u4f38\u7f29\u3001\u6545\u969c\u7b49\u539f\u56e0\u662f\u52a8\u6001\u53d8\u5316\u7684\uff0c\u6240\u4ee5\u670d\u52a1\u5b9e\u4f8b\u7684\u8def\u7531\u4fe1\u606f\u53c8\u4e3a\u52a8\u6001\u6570\u636e\u3002\u901a\u8fc7\u5206\u5c42\u7ba1\u7406\u5fae\u670d\u52a1\u7684\u8fd9\u4e9b\u6570\u636e\uff0c\u4e5f\u5c31\u81ea\u7136\u800c\u7136\u7684\u5b9e\u73b0\u4e86\u5b9e\u4f8b\u4e4b\u95f4\u7684\u903b\u8f91\u9694\u79bb\u3002</p>"},{"location":"build-provider/definition/isolate-relationship.html#_3","title":"\u9694\u79bb\u5c42\u6b21\u8bf4\u660e","text":"<p>ServiceComb\u652f\u6301\u81ea\u5b9a\u4e49\u5206\u5c42\u914d\u7f6e\uff0c\u6ee1\u8db3\u7528\u6237\u7684\u5b9e\u4f8b\u5206\u5c42\u7ba1\u7406\u9700\u6c42\uff0c\u4ee5\u4e0b\u662f\u5177\u4f53\u914d\u7f6e\u8bf4\u660e\u3002</p> <ul> <li>\u5e94\u7528ID</li> </ul> <p>\u901a\u8fc7APPLICATIOIN_ID\u6765\u5b9a\u4e49\uff0c\u7f3a\u7701\u503c\u4e3adefault\u3002\u5fae\u670d\u52a1\u5728\u53d1\u73b0\u5b9e\u4f8b\u7684\u65f6\u5019\uff0c\u7f3a\u7701\u53ea\u80fd\u591f\u88ab\u76f8\u540cAPPLICATIOIN_ID\u4e0b\u7684\u6d88\u8d39\u8005\u53d1\u73b0\u3002</p> <ul> <li>Domain\u540d\u79f0</li> </ul> <p>\u901a\u8fc7cse.config.client.domainName\u6765\u5b9a\u4e49\uff0c\u7f3a\u7701\u503c\u4e3adefault\u3002\u4f5c\u4e3a\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\uff0c\u7528\u4e8e\u8868\u660e\u81ea\u8eab\u6240\u5c5e\u79df\u6237\u4fe1\u606f\u3002\u5fae\u670d\u52a1\u5728\u53d1\u73b0\u5b9e\u4f8b\u7684\u65f6\u5019\uff0c\u53ea\u80fd\u88ab\u76f8\u540c\u79df\u6237\u4e0b\u7684\u6d88\u8d39\u8005\u53d1\u73b0\u3002</p> <ul> <li>\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f</li> </ul> <p>\u6570\u636e\u4e2d\u5fc3\u5305\u62ec3\u4e2a\u5c5e\u6027\uff1acse.datacenter.name\uff0c cse.datacenter.region, cse.datacenter.availableZone\u3002\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f\u4e0d\u63d0\u4f9b\u9694\u79bb\u80fd\u529b\uff0c\u5fae\u670d\u52a1\u53ef\u4ee5\u53d1\u73b0\u5176\u4ed6\u6570\u636e\u4e2d\u5fc3\u7684\u5b9e\u4f8b\u3002\u4f46\u662f\u53ef\u4ee5\u901a\u8fc7\u542f\u7528\u5b9e\u4f8b\u4eb2\u548c\u6027\uff0c\u6765\u4f18\u5148\u5f80\u6307\u5b9a\u7684\u533a\u57df\u6216\u8005Zone\u53d1\u6d88\u606f\uff1a</p> <pre><code>cse:\n loadbalance:\n serverListFilters: zoneaware\n serverListFilter:\n zoneaware:\n className: org.apache.servicecomb.loadbalance.filter.ZoneAwareServerListFilterExt\n</code></pre> <p>\u8fd9\u6837\u914d\u7f6e\u540e\uff0c\u5ba2\u6237\u7aef\u5728\u8def\u7531\u7684\u65f6\u5019\uff0c\u4f1a\u4f18\u5148\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230zone/region\u90fd\u76f8\u540c\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u662fregion\u76f8\u540c\uff0c\u4f46zone\u4e0d\u76f8\u540c\u7684\u5b9e\u4f8b\uff0c\u90fd\u4e0d\u76f8\u540c\u7684\u65f6\u5019\uff0c\u5219\u6309\u7167\u8def\u7531\u89c4\u5219\u9009\u62e9\u4e00\u4e2a\u3002\u4eb2\u548c\u6027\u4e0d\u662f\u903b\u8f91\u9694\u79bb\uff0c\u53ea\u8981\u5b9e\u4f8b\u4e4b\u95f4\u7f51\u7edc\u662f\u8054\u901a\u7684\uff0c\u90a3\u4e48\u90fd\u6709\u53ef\u80fd\u8bbf\u95ee\u5230\uff1b\u5982\u679c\u7f51\u7edc\u4e0d\u901a\uff0c\u5219\u4f1a\u8bbf\u95ee\u5931\u8d25\u3002</p> <ul> <li>\u73af\u5883\u4fe1\u606f</li> </ul> <p>\u5728yaml\u6587\u4ef6\u91cc\u901a\u8fc7service_description.environment\u6765\u914d\u7f6e\uff0c\u540c\u65f6\u652f\u6301\u901a\u8fc7\u73af\u5883\u53d8\u91cfSERVICECOMB_ENV\u914d\u7f6e\uff0c\u4ec5\u652f\u6301\u4ee5\u4e0b\u679a\u4e3e\u503c development,testing,acceptance,production\uff0c\u7f3a\u7701\u503c\u4e3a\"\"(\u7a7a)\u3002\u5fae\u670d\u52a1\u5728\u53d1\u73b0\u5b9e\u4f8b\u7684\u65f6\u5019\uff0c\u7f3a\u7701\u53ea\u80fd\u591f\u88ab\u76f8\u540cenvironment\u4e0b\u7684\u6d88\u8d39\u8005\u53d1\u73b0\u3002</p> <pre><code>service_description:\n environment: production\n</code></pre>"},{"location":"build-provider/definition/isolate-relationship.html#_4","title":"\u4e0e\u534e\u4e3a\u516c\u6709\u4e91\u6982\u5ff5\u7684\u5bf9\u5e94\u5173\u7cfb","text":"<p>\u534e\u4e3a\u516c\u6709\u4e91\u6709\u7c7b\u4f3c\u7684\u6982\u5ff5\uff0c\u5e94\u7528\u3001\u79df\u6237\u3001Project\u3001Cluster\u7b49\uff0c\u5728\u5b9e\u9645\u5e94\u7528\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u5206\u522b\u5bf9\u5e94\u5230ServiceComb\u7684\u5e94\u7528\u3001\u79df\u6237\u3001Domain\u3001Zone\u7b49\u4fe1\u606f\u3002\u6bd4\u5982\u5728\u516c\u6709\u4e91\u4e0a\u5982\u679cCluster\u5171\u4eabProject\uff0c\u90a3\u4e48\u5c31\u53ef\u4ee5\u901a\u8fc7zone\u6765\u5bf9\u5e94Cluster\uff0c\u5b9e\u73b0\u96c6\u7fa4\u4e4b\u95f4\u7684\u4eb2\u548c\u6027\u8bbf\u95ee\u3002</p>"},{"location":"build-provider/definition/service-definition.html","title":"\u5fae\u670d\u52a1\u5b9a\u4e49","text":"<p>Java Chassis\u5b9a\u4e49\u4e86\u4e00\u7ec4\u57fa\u7840\u7684\u6982\u5ff5\uff0c\u8fd9\u4e9b\u6982\u5ff5\u4f1a\u7528\u4e8e\u5fae\u670d\u52a1\u6ce8\u518c\u53d1\u73b0\u3001\u670d\u52a1\u6cbb\u7406\u7b49\u591a\u79cd\u573a\u666f\u3002\u4e13\u9898\u6587\u7ae0\u5fae\u670d\u52a1\u5b9e\u4f8b\u95f4\u591a\u73af\u5883\u9694\u79bb\u4ecb\u7ecd\u4e86\u4e00\u4e9b\u5e38\u89c1\u5e94\u7528\u573a\u666f\u3002</p> <p>Java Chassis\u6700\u6838\u5fc3\u7684\u51e0\u4e2a\u6982\u5ff5\u5982\u4e0b\u3002</p> <ul> <li>\u73af\u5883\u540d\u79f0\uff1a\u7528\u4e8e\u8868\u793a\u90e8\u7f72\u73af\u5883\uff0c\u4e0d\u540c\u73af\u5883\u7684\u5fae\u670d\u52a1\u4e4b\u95f4\u4e0d\u80fd\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u3002\u5bf9\u4e8e\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\uff0c\u4f1a\u4ee5\u5bf9\u5e94\u7684\u6982\u5ff5\u8868\u793a\u73af\u5883\u3002\u6bd4\u5982Nacos\u4f7f\u7528 <code>namespace</code> \u6765\u8868\u793a\u73af\u5883\u3002</li> <li>\u5e94\u7528\u540d\u79f0\uff1a\u7528\u4e8e\u63cf\u8ff0\u4e00\u7ec4\u53ef\u4ee5\u76f8\u4e92\u8bbf\u95ee\u7684\u5fae\u670d\u52a1\uff0c\u4e0d\u540c\u5e94\u7528\u540d\u79f0\u4e4b\u95f4\u662f\u903b\u8f91\u9694\u79bb\u7684\uff0c\u4e0d\u80fd\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u3002\u5bf9\u4e8e\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\uff0c\u4f1a\u4ee5\u5bf9\u5e94\u7684\u6982\u5ff5\u8868\u793a\u5e94\u7528\u3002\u6bd4\u5982Nacos\u4f7f\u7528 <code>group</code> \u6765\u8868\u793a\u5e94\u7528\u3002 </li> <li>\u5fae\u670d\u52a1\u540d\u79f0\uff1a\u7528\u4e8e\u6807\u8bc6\u4e00\u4e2a\u5fae\u670d\u52a1\u3002\u53ef\u4ee5\u901a\u8fc7\u5fae\u670d\u52a1\u540d\u79f0\u67e5\u8be2\u9700\u8981\u8bbf\u95ee\u7684\u76ee\u6807\u5fae\u670d\u52a1\u3002</li> <li>\u5fae\u670d\u52a1\u7248\u672c\uff1a\u8868\u793a\u5fae\u670d\u52a1\u7684\u7248\u672c\u3002\u5f53\u5b58\u5728\u5fae\u670d\u52a1\u5c5e\u6027\u53d8\u5316\u3001\u63a5\u53e3\u53d8\u5316\u7684\u573a\u666f\uff0c\u5efa\u8bae\u4fee\u6539\u7248\u672c\u53f7\u3002</li> <li>\u5fae\u670d\u52a1\u63cf\u8ff0\uff1a\u7b80\u5355\u7684\u5fae\u670d\u52a1\u63cf\u8ff0\u4fe1\u606f\u3002</li> <li>\u5fae\u670d\u52a1\u5c5e\u6027\uff1a\u7528\u4e8e\u63cf\u8ff0\u5fae\u670d\u52a1\u7684\u6269\u5c55\u4fe1\u606f\u3002</li> </ul> <p>\u5f00\u53d1\u4e00\u4e2a\u5fae\u670d\u52a1\uff0c\u9700\u8981\u5728 <code>application.yaml</code> \u6587\u4ef6\u4e2d\u914d\u7f6e\u5fae\u670d\u52a1\u7684\u57fa\u672c\u4fe1\u606f\u3002</p> <pre><code>servicecomb:\n service:\n application: helloTest\n name: helloServer \n version: 0.0.1 \n properties: \n key1: value1\n key2: value2\n description: This is a description about the microservice\n</code></pre>"},{"location":"build-provider/definition/service-definition.html#_2","title":"\u914d\u7f6e\u9879\u53c2\u8003","text":"\u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u662f\u5426\u5fc5\u9009 \u542b\u4e49 servicecomb.service.environment - \u5426 \u73af\u5883\u540d\u79f0\uff0c\u6bd4\u5982 development, production \u7b49 servicecomb.service.application default \u662f \u5e94\u7528\u540d\u79f0 servicecomb.service.name defaultMicroservice \u662f \u5fae\u670d\u52a1\u540d\u79f0, \u5e94\u786e\u4fdd\u5e94\u7528\u5185\u90e8\u552f\u4e00\u3002\u5fae\u670d\u52a1\u540d\u652f\u6301\u6570\u5b57\u3001\u5927\u5c0f\u5199\u5b57\u6bcd\u548c\"-\"\u3001\"_\"\u3001\".\"\u4e09\u4e2a\u7279\u6b8a\u5b57\u7b26\uff0c\u4f46\u662f\u4e0d\u80fd\u4ee5\u7279\u6b8a\u5b57\u7b26\u4f5c\u4e3a\u9996\u5c3e\u5b57\u7b26\uff0c\u547d\u540d\u89c4\u8303\u4e3a\uff1a^[a-zA-Z0-9]+$|^[a-zA-Z0-9][a-zA-Z0-9_-.]*[a-zA-Z0-9]$\u3002 servicecomb.service.version 1.0.0.0 \u662f \u5fae\u670d\u52a1\u7248\u672c servicecomb.service.description - \u5426 \u5fae\u670d\u52a1\u63cf\u8ff0 servicecomb.service.properties - \u5426 \u5fae\u670d\u52a1\u5c5e\u6027 <p>\u8bf4\u660e\uff1a</p> <ul> <li>\u5fae\u670d\u52a1\u5c5e\u6027\u4f1a\u968f\u670d\u52a1\u4e00\u540c\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u3002\u5982\u679c\u5b58\u5728\u53d8\u66f4\uff0c\u5efa\u8bae\u540c\u65f6\u4fee\u6539\u5fae\u670d\u52a1\u7248\u672c\u53f7\u3002</li> <li>\u867d\u7136\u5fae\u670d\u52a1\u540d\u79f0\u53ef\u4ee5\u4f7f\u7528 <code>.</code> \u5b57\u7b26\uff0c\u4f46\u662f\u4e0d\u63a8\u8350\u5728\u547d\u540d\u4e2d\u4f7f\u7528 <code>.</code> \u3002\u8fd9\u662f\u7531\u4e8eyaml\u683c\u5f0f\u7684\u914d\u7f6e\u6587\u4ef6\u5c06 <code>.</code> \u7b26\u53f7\u7528\u4e8e\u5206\u5272\u914d\u7f6e\u9879\u540d\u79f0\uff0c \u5982\u679c\u5fae\u670d\u52a1\u540d\u79f0\u5305\u542b\u4e86 <code>.</code> \u53ef\u80fd\u4f1a\u5bfc\u81f4\u4e00\u4e9b\u652f\u6301\u5fae\u670d\u52a1\u3001\u5951\u7ea6\u7ea7\u522b\u7684\u914d\u7f6e\u65e0\u6cd5\u6b63\u786e\u88ab\u8bc6\u522b\u3002</li> </ul>"},{"location":"config/apollo.html","title":"\u4f7f\u7528 Apollo","text":"<p>\u6ce8\u610f\uff1a\u672c\u5b9e\u73b0\u4f5c\u4e3a\u9002\u914d Apollo \u7684\u53c2\u8003\uff0c\u6574\u4f53\u903b\u8f91\u529f\u80fd\u548c\u8bbe\u8ba1\u89c4\u683c\u4e0d\u5b8c\u5584\uff0c\u4e0d\u5efa\u8bae\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u3002 \u5982\u679c\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\uff0c\u5efa\u8bae\u57fa\u4e8e Apollo \u63d0\u4f9b\u7684 SDK \u81ea\u884c\u6269\u5c55\u5b9e\u73b0\u3002</p> <p>Apollo \u662f\u643a\u7a0b\u6846\u67b6\u90e8\u95e8\u7814\u53d1\u7684\u5206\u5e03\u5f0f\u914d\u7f6e\u4e2d\u5fc3\u3002 Apollo\u7684\u4e0b\u8f7d\u5b89\u88c5\u8bf7\u53c2\u8003\u5b98\u7f51\u4ecb\u7ecd\u3002</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;config-apollo&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u7136\u540e\u5728\u914d\u7f6e\u6587\u4ef6 microservice.yaml \u4e2d\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\u9879\uff1a</p> <pre><code>apollo:\n config:\n serverUri: http://127.0.0.1:8070\n serviceName: apollo-test\n env: DEV\n clusters: test-cluster\n namespace: application\n token: xxx\n refreshInterval: 30\n firstRefreshInterval: 0\n</code></pre>"},{"location":"config/cse1.html","title":"\u534e\u4e3a\u4e91CSE1.0\u914d\u7f6e\u4e2d\u5fc3","text":"<p>\u6ce8\u610f\uff1aCSE1.0\u914d\u7f6e\u4e2d\u5fc3\u5df2\u7ecf\u9010\u6b65\u4e0b\u7ebf\uff0c \u672c\u5b9e\u73b0\u4ec5\u4f9b\u9057\u7559\u529f\u80fd\u4f7f\u7528\uff0c\u65b0\u529f\u80fd\u4e0d\u5efa\u8bae\u4f7f\u7528\u3002</p> <p>\u534e\u4e3a\u4e91CSE1.0\u914d\u7f6e\u4e2d\u5fc3\u662f\u534e\u4e3a\u4e91CSE\u4ea7\u54c1\u7684\u4e00\u4e2a\u90e8\u4ef6\uff0cjava-chassis \u6700\u65e9\u4f7f\u7528\u5b83\u4f5c\u4e3a\u914d\u7f6e\u4e2d\u5fc3\u3002 \u5bf9\u63a5\u8fd9\u4e2a\u914d\u7f6e\u4e2d\u5fc3\u7684\u4ee3\u7801\u5728 config-cc \u6a21\u5757\u5b9e\u73b0\u3002</p> <p>\u53ef\u4ee5\u4ece \u8f7b\u91cf\u5316\u5fae\u670d\u52a1\u5f15\u64ce \u4e0b\u8f7d\u672c\u5730\u4f7f\u7528\u7684\u7248\u672c\u3002\u4e5f\u53ef\u4ee5 \u76f4\u63a5\u8bbf\u95ee\u534e\u4e3a\u4e91 ServiceStage \u4ea7\u54c1\uff0c\u4f7f\u7528\u5728\u7ebf\u7684\u7248\u672c\u3002</p> <p>\u4f7f\u7528\u534e\u4e3a\u4e91\u914d\u7f6e\u4e2d\u5fc3\uff0c\u9700\u8981\u5728\u9879\u76ee\u4e2d\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;config-cc&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u7136\u540e\u5728\u914d\u7f6e\u6587\u4ef6 microservice.yaml \u4e2d\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n config:\n client:\n serverUri: http://127.0.0.1:30113\n refreshMode: 0\n refresh_interval: 5000\n refreshPort: 30114\n</code></pre> <p>\u534e\u4e3a\u4e91\u914d\u7f6e\u4e2d\u5fc3\u7684\u5176\u4ed6\u914d\u7f6e\u9879\u542b\u4e49\u5982\u4e0b\uff1a</p> \u914d\u7f6e\u9879\u540d \u63cf\u8ff0 servicecomb.config.client.refreshMode \u5e94\u7528\u914d\u7f6e\u7684\u5237\u65b0\u65b9\u5f0f\uff0c<code>0</code>\u4e3aconfig-center\u4e3b\u52a8push\uff0c<code>1</code>\u4e3aclient\u5468\u671fpull\uff0c\u9ed8\u8ba4\u4e3a<code>0</code> servicecomb.config.client.refreshPort config-center\u63a8\u9001\u914d\u7f6e\u7684\u7aef\u53e3 servicecomb.config.client.tenantName \u5e94\u7528\u7684\u79df\u6237\u540d\u79f0 servicecomb.config.client.serverUri config-center\u8bbf\u95ee\u5730\u5740\uff0c\u683c\u5f0f\u4e3a<code>http(s)://{ip}:{port}</code>\uff0c\u4ee5<code>,</code>\u5206\u9694\u591a\u4e2a\u5730\u5740 servicecomb.config.client.refresh_interval pull\u6a21\u5f0f\u4e0b\u5237\u65b0\u914d\u7f6e\u9879\u7684\u65f6\u95f4\u95f4\u9694\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff0c\u9ed8\u8ba4\u503c\u4e3a15000 servicecomb.config.client.fileSource \u6307\u5b9a\u8be5\u914d\u7f6e\u9879\u7684\u5185\u5bb9\u4e3ayaml\u6587\u4ef6\uff0c\u591a\u4e2a\u914d\u7f6e\u6587\u4ef6\u53ef\u4ee5\u7528<code>,</code>\u5206\u9694"},{"location":"config/general-config.html","title":"\u670d\u52a1\u914d\u7f6e\u4ecb\u7ecd","text":"<p>\u5e94\u7528\u7a0b\u5e8f\u4e00\u822c\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u3001\u73af\u5883\u53d8\u91cf\u7b49\u7ba1\u7406\u914d\u7f6e\u4fe1\u606f\u3002\u5fae\u670d\u52a1\u67b6\u6784\u5bf9\u7edf\u4e00\u914d\u7f6e\u63d0\u51fa\u4e86\u66f4\u9ad8\u7684\u8981\u6c42\uff0c\u5f88\u591a\u914d\u7f6e\u4fe1\u606f\u9700\u8981\u5728\u4e0d\u542f\u505c\u670d\u52a1\u7684\u60c5\u51b5\u4e0b\u5b9e\u73b0\u52a8\u6001\u4fee\u6539\u3002 Java Chassis \u652f\u6301\u4e30\u5bcc\u7684\u914d\u7f6e\u6e90\uff0c\u5bf9\u4e0d\u540c\u7684\u914d\u7f6e\u6e90\u8fdb\u884c\u4e86\u62bd\u8c61\uff0c \u5f00\u53d1\u8005\u53ef\u4ee5\u4e0d\u5173\u5fc3\u914d\u7f6e\u9879\u5177\u4f53\u7684\u914d\u7f6e\u6e90\uff0c\u91c7\u7528\u7edf\u4e00\u7684\u63a5\u53e3\u8bfb\u53d6\u914d\u7f6e\u3002</p>"},{"location":"config/general-config.html#_2","title":"\u914d\u7f6e\u6e90\u5c42\u7ea7","text":"<p>Java \u63d0\u4f9b\u4e86\u5206\u5c42\u6b21\u7684\u914d\u7f6e\u673a\u5236\u3002\u6309\u7167\u4f18\u5148\u7ea7\u4ece\u9ad8\u5230\u4f4e\uff0c\u5206\u4e3a\uff1a</p> <ul> <li>\u914d\u7f6e\u4e2d\u5fc3\uff08\u52a8\u6001\u914d\u7f6e\uff09</li> <li>Java System Property\uff08-D\u53c2\u6570\uff09</li> <li>\u73af\u5883\u53d8\u91cf</li> <li>\u914d\u7f6e\u6587\u4ef6</li> </ul>"},{"location":"config/general-config.html#_3","title":"\u914d\u7f6e\u6587\u4ef6","text":"<ul> <li>microservice.yaml</li> </ul> <p>microservice.yaml \u6587\u4ef6\u662f\u4f18\u5148\u7ea7\u6700\u4f4e\u7684\u914d\u7f6e\u6587\u4ef6\u3002Java Chassis \u542f\u52a8\u65f6\u4f1a\u4ece classpath \u7684\u5404\u4e2a jar \u5305\u3001\u78c1\u76d8\u76ee\u5f55\u4e2d\u52a0\u8f7d microservice.yaml \u6587\u4ef6\uff0c\u5e76\u5c06\u8fd9\u4e9b\u6587\u4ef6\u5408\u5e76\u4e3a\u4e00\u4efd microservice.yaml \u914d\u7f6e\u3002\u4f4d\u4e8e\u78c1\u76d8\u4e0a\u7684 microservice.yaml \u6587\u4ef6\u4f18\u5148\u7ea7\u9ad8\u4e8ejar\u5305\u4e2d\u7684microservice.yaml \u6587\u4ef6\u3002\u7528\u6237\u8fd8\u53ef\u4ee5\u901a\u8fc7\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u6307\u5b9a <code>servicecomb-config-order</code>\u6765\u6307\u5b9a\u4f18\u5148\u7ea7\uff0c \u5982\u679c\u4e0d\u540c\u8def\u5f84\u4e0b\u7684 microservice.yaml \u5305\u542b\u4e00\u6837\u7684\u914d\u7f6e\u9879\uff0c\u6587\u4ef6\u4e2d <code>servicecomb-config-order</code> \u503c\u5927\u7684\u914d\u7f6e\u9879\u4f1a\u8986\u76d6\u503c\u5c0f\u7684\u914d\u7f6e\u9879\u3002</p> <p>Tips\uff1a\u7531\u4e8e\u78c1\u76d8\u4e0a\u7684microservice.yaml\u6587\u4ef6\u4f18\u5148\u7ea7\u8f83\u9ad8\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6253\u5305\u65f6\u5728\u670d\u52a1\u53ef\u6267\u884cjar\u5305\u7684classpath\u91cc\u52a0\u4e0a<code>.</code>\u76ee\u5f55\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728\u670d\u52a1jar\u5305\u6240\u5728\u7684\u76ee\u5f55\u91cc\u653e\u7f6e\u4e00\u4efdmicroservice.yaml\u6765\u8986\u76d6jar\u5305\u5185\u7684\u914d\u7f6e\u6587\u4ef6\u3002</p> <ul> <li>Spring Boot \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6 application.yaml \u7b49</li> </ul> <p>Java Chassis \u7ee7\u627f\u4e86 Spring Boot \u7684\u914d\u7f6e\u673a\u5236\uff0c\u53ef\u4ee5\u4f7f\u7528Spring Boot \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\u3002 microservice.yaml \u7684\u4f18\u5148\u7ea7\u6bd4 application.yaml \u4f4e\u3002</p>"},{"location":"config/general-config.html#_4","title":"\u73af\u5883\u53d8\u91cf","text":"<p>Linux\u7684\u73af\u5883\u53d8\u91cf\u540d\u4e0d\u5141\u8bb8\u5e26<code>.</code>\u7b26\u53f7\uff0c\u56e0\u6b64\u67d0\u4e9b\u914d\u7f6e\u9879\u65e0\u6cd5\u76f4\u63a5\u914d\u7f6e\u5728\u73af\u5883\u53d8\u91cf\u91cc\u3002\u53ef\u4ee5\u5c06\u914d\u7f6e\u9879key\u7684<code>.</code>\u7b26\u53f7\u6539\u4e3a\u4e0b\u5212\u7ebf<code>_</code>\uff0c\u5c06\u8f6c\u6362\u540e\u7684\u914d\u7f6e\u9879\u914d\u5728\u73af\u5883\u53d8\u91cf\u91cc\uff0cJava Chassis \u53ef\u4ee5\u81ea\u52a8\u5c06\u73af\u5883\u53d8\u91cf\u5339\u914d\u5230\u539f\u914d\u7f6e\u9879\u4e0a\u3002</p> <p>\u4f8b\u5982\uff1a\u5bf9\u4e8e microservice.yaml \u4e2d\u914d\u7f6e\u7684</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:8080\n</code></pre> <p>\u53ef\u4ee5\u5728\u73af\u5883\u53d8\u91cf\u4e2d\u8bbe\u7f6e <code>servicecomb_rest_address=0.0.0.0:9090</code> \u6765\u5c06\u670d\u52a1\u76d1\u542c\u7684\u7aef\u53e3\u8986\u5199\u4e3a9090\u3002\u8fd9\u79cd\u4e0b\u5212\u7ebf\u8f6c\u70b9\u53f7\u7684\u673a\u5236\u4e5f\u9002\u7528\u4e8e\u5176\u4ed6\u7684\u914d\u7f6e\u5c42\u7ea7\u3002</p> <p>\u7531\u4e8e\u4e0a\u8ff0\u9650\u5236\uff0c\u6700\u597d\u7684\u65b9\u5f0f\u662f\u5728\u542f\u52a8\u53c2\u6570\u91cc\u9762\u4f7f\u7528 Java System Property\u3002 \u6bd4\u5982 <code>-Dservicecomb.rest.address=${LISTEN_ADDRESS}</code>\uff0c \u8bbe\u7f6e\u7684\u73af\u5883\u53d8\u91cf LISTEN_ADDRESS \u7b26\u5408\u64cd\u4f5c\u7cfb\u7edf\u7684\u547d\u540d\u89c4\u8303\u3002</p>"},{"location":"config/general-config.html#_5","title":"\u914d\u7f6e\u4e2d\u5fc3\uff08\u52a8\u6001\u914d\u7f6e\uff09","text":"<p>\u914d\u7f6e\u4e2d\u5fc3\u662f\u5fae\u670d\u52a1\u67b6\u6784\u4e0b\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u4e2d\u95f4\u4ef6\uff0c\u901a\u8fc7\u914d\u7f6e\u4e2d\u5fc3\u7528\u6237\u53ef\u4ee5\u589e\u52a0\u548c\u5220\u9664\u914d\u7f6e\u4fe1\u606f\uff0c\u914d\u7f6e\u4fe1\u606f\u4f1a\u901a\u8fc7\u4e0d\u540c\u7684\u901a\u77e5\u673a\u5236\uff0c \u5c06\u914d\u7f6e\u7684\u53d8\u5316\u63a8\u9001\u5230\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002 Java Chassis \u5141\u8bb8\u7528\u6237\u4f7f\u7528\u4e0d\u540c\u7684\u914d\u7f6e\u4e2d\u5fc3\uff0c \u5e76\u652f\u6301\u591a\u4e2a\u914d\u7f6e\u4e2d\u5fc3\u5171\u5b58\u3002</p> <p>\u914d\u7f6e\u4e2d\u5fc3\u7684\u4f18\u5148\u7ea7\u9ad8\u4e8e\u6587\u4ef6\u914d\u7f6e\u3002 </p>"},{"location":"config/general-config.html#_6","title":"\u8fdb\u884c\u914d\u7f6e\u9879\u6620\u5c04","text":"<p>\u914d\u7f6e\u9879\u6620\u5c04\u53ef\u4ee5\u7528\u4e8e\u7ed9\u914d\u7f6e\u9879\u53d6\u4e00\u4e2a\u522b\u540d\uff0c\u5728\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u8986\u76d6\u4e1a\u52a1\u914d\u7f6e\u3001\u517c\u5bb9\u6027\u573a\u666f\u5e7f\u6cdb\u4f7f\u7528\u3002 \u8fdb\u884c\u914d\u7f6e\u9879\u6620\u5c04\u901a\u8fc7 classpath \u4e0b\u7684 mapping.yaml \u5b9a\u4e49\uff1a</p> <pre><code>PAAS_CSE_SC_ENDPOINT:\n - servicecomb.registry.sc.address\n</code></pre> <p>\u5047\u8bbe <code>PAAS_CSE_SC_ENDPOINT</code> \u662f\u73af\u5883\u53d8\u91cf\uff0c\u5e94\u7528\u7a0b\u5e8f\u8bfb\u53d6 <code>servicecomb.service.registry.address</code> \u7684\u5730\u65b9\uff0c \u4f1a\u53d6\u5230\u73af\u5883\u53d8\u91cf<code>PAAS_CSE_SC_ENDPOINT</code>\u7684\u503c\u3002</p> <p>\u4f7f\u7528\u914d\u7f6e\u9879\u6620\u5c04\u4e5f\u53ef\u4ee5\u4f7f\u7528 Spring Boot \u7684 place holder \u673a\u5236\uff0c \u4e0a\u8ff0\u7684\u89e3\u51b3\u65b9\u6848\u53ef\u4ee5\u66ff\u6362\u4e3a\u5728 application.yaml \u6587\u4ef6\u4e2d\u4f7f\u7528\uff1a</p> <pre><code>servicecomb:\n registry:\n sc:\n address: ${PAAS_CSE_SC_ENDPOINT:http://localhost:30100}\n</code></pre> <p>\u63a8\u8350\u4f7f\u7528 Spring Boot \u7684 place holder \u673a\u5236\uff0c \u66f4\u52a0\u7b80\u6d01\u548c\u5bb9\u6613\u7406\u89e3\u3002 </p>"},{"location":"config/kie.html","title":"\u4f7f\u7528 Kie","text":""},{"location":"config/kie.html#_1","title":"\u4e0b\u8f7d\u5b89\u88c5","text":"<p>\u53ef\u4ee5\u901a\u8fc7 Kie\u5b98\u7f51 \u4e0b\u8f7d\u548c\u5b89\u88c5Kie\u3002\u534e\u4e3a\u4e91\u63d0\u4f9b\u4e86\u4e00\u4e2a\u96c6\u6210\u6ce8\u518c\u4e2d\u5fc3\u7684\u672c\u5730\u7248\u672c\uff0c\u5e76\u63d0\u4f9b\u4e86\u53cb\u597d\u7684\u754c\u9762\uff0c\u53ef\u4ee5\u901a\u8fc7 \u534e\u4e3a\u4e91 \u4e0b\u8f7d\u548c\u4f7f\u7528\u3002</p>"},{"location":"config/kie.html#_2","title":"\u5f00\u53d1\u4f7f\u7528","text":"<p>\u4f7f\u7528 Kie\uff0c \u9700\u8981\u5f15\u5165\u4e0b\u9762\u7684\u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;config-kie&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u7136\u540e\u5728\u914d\u7f6e\u6587\u4ef6 microservice.yaml \u4e2d\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n kie:\n serverUri: http://127.0.0.1:30110\n</code></pre> <ul> <li>\u4f7f\u7528\u914d\u7f6e\u4e2d\u5fc3\u589e\u52a0\u914d\u7f6e</li> </ul> <p>\u5ba2\u6237\u7aef\u9ed8\u8ba4\u4f1a\u8bfb\u53d6\u4e0b\u9762\u51e0\u4e2a\u5c42\u6b21\u7684\u914d\u7f6e\uff1a</p> <pre><code>* \u5e94\u7528\u7ea7\u914d\u7f6e\uff1aLabel\u53ea\u5305\u542benvironment\u3001app\uff0c\u5e76\u4e14\u4e0e\u5fae\u670d\u52a1\u7684\u73af\u5883\u3001\u5e94\u7528\u5339\u914d\u7684\u914d\u7f6e\u3002\n* \u670d\u52a1\u7ea7\u914d\u7f6e\uff1aLabel\u53ea\u5305\u542benvironment\u3001app\u3001service\uff0c\u5e76\u4e14\u4e0e\u5fae\u670d\u52a1\u7684\u73af\u5883\u3001\u5e94\u7528\u3001\u5fae\u670d\u52a1\u540d\u79f0\u5339\u914d\u7684\u914d\u7f6e\u3002\n* \u7248\u672c\u7ea7\u914d\u7f6e\uff1aLabel\u53ea\u5305\u542benvironment\u3001app\u3001service\u3001version\uff0c\u5e76\u4e14\u4e0e\u5fae\u670d\u52a1\u7684\u73af\u5883\u3001\u5e94\u7528\u3001\u5fae\u670d\u52a1\u540d\u79f0\u3001\u7248\u672c\u5339\u914d\u7684\u914d\u7f6e\u3002\n* \u81ea\u5b9a\u4e49\u914d\u7f6e\uff1aLabel\u5305\u542bcustom-label, \u5e76\u4e14\u4e0e custom-value\u5339\u914d\u7684\u914d\u7f6e\u3002\n</code></pre> <p>\u4e0a\u8ff0\u7684\u914d\u7f6e\u7ea7\u522b\uff0c\u4f18\u5148\u7ea7\u4ece\u4f4e\u5230\u9ad8\u3002 Kie \u7684 yaml \u548c properties \u7c7b\u578b\u4f1a\u6620\u5c04\u4e3a\u591a\u4e2a\u914d\u7f6e\u9879\uff0c \u5176\u4ed6\u7c7b\u578b\uff0c\u6bd4\u5982 json, text\uff0c \u53ea\u4f1a\u6620\u5c04\u4e3a\u4e00\u4e2a\u914d\u7f6e\u9879\u3002\u5f00\u53d1\u8005\u9700\u8981\u8bfb\u53d6\u914d\u7f6e\u9879\u81ea\u5df1\u89e3\u6790\u5185\u5bb9\u3002</p> <ul> <li>\u914d\u7f6e\u9879\u53c2\u8003</li> </ul> \u914d\u7f6e\u9879\u540d \u542b\u4e49 \u7f3a\u7701\u503c servicecomb.kie.serverUri servicecomb-kie\u8bbf\u95ee\u5730\u5740\uff0c\u683c\u5f0f\u4e3a<code>http(s)://{ip}:{port}</code>\uff0c\u4ee5<code>,</code>\u5206\u9694\u591a\u4e2a\u5730\u5740 \u7a7a servicecomb.kie.enableLongPolling Long Polling \u6a21\u5f0f\u662f\u5426\u5f00\u542f true servicecomb.kie.pollingWaitTime Long Polling \u6a21\u5f0f\u4e0b\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u79d2 10 servicecomb.kie.firstPullRequired \u542f\u52a8\u7684\u65f6\u5019\u7b2c\u4e00\u6b21\u67e5\u8be2\u914d\u7f6e\u5931\u8d25\uff0c\u662f\u5426\u7ec8\u6b62\u542f\u52a8\u3002 true servicecomb.kie.domainName \u533a\u57df\u540d\u79f0 default servicecomb.kie.refresh_interval Pull \u6a21\u5f0f\u4e0b\u5237\u65b0\u914d\u7f6e\u9879\u7684\u65f6\u95f4\u95f4\u9694\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\u3002 15000 servicecomb.kie.firstRefreshInterval Pull \u6a21\u5f0f\u4e0b\u542f\u52a8\u8fc7\u7a0b\u4e2d\u9996\u6b21\u5237\u65b0\u65f6\u95f4\u95f4\u9694\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\u3002 3000 servicecomb.kie.enableAppConfig \u662f\u5426\u5f00\u542f\u5e94\u7528\u914d\u7f6e true servicecomb.kie.enableServiceConfig \u662f\u5426\u5f00\u542f\u670d\u52a1\u914d\u7f6e true servicecomb.kie.enableVersionConfig \u662f\u5426\u5f00\u542f\u7248\u672c\u914d\u7f6e true servicecomb.kie.enableVersionConfig \u662f\u5426\u5f00\u542f\u81ea\u5b9a\u4e49\u914d\u7f6e true servicecomb.kie.customLabel \u81ea\u5b9a\u4e49\u914d\u7f6e\u7684Label public servicecomb.kie.customLabelValue \u81ea\u5b9a\u4e49\u914d\u7f6e\u7684Value \u7a7a"},{"location":"config/nacos.html","title":"\u4f7f\u7528 Nacos","text":""},{"location":"config/nacos.html#_1","title":"\u4e0b\u8f7d\u5b89\u88c5","text":"<p>\u53ef\u4ee5\u901a\u8fc7 Nacos\u5b98\u7f51 \u4e0b\u8f7d\u548c\u5b89\u88c5 Nacos\u3002</p>"},{"location":"config/nacos.html#_2","title":"\u5f00\u53d1\u4f7f\u7528","text":"<p>\u4f7f\u7528Nacos\uff0c\u9700\u8981\u5728\u9879\u76ee\u4e2d\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;config-nacos&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u7136\u540e\u5728\u914d\u7f6e\u6587\u4ef6 microservice.yaml \u4e2d\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n nacos:\n serverAddr: http://127.0.0.1:8848\n</code></pre> <ul> <li>\u914d\u7f6e\u4e2d\u5fc3\u589e\u52a0\u914d\u7f6e</li> </ul> <p>Nacos\u7684namespace\u5bf9\u5e94\u4e8eJava Chassis Environment, group\u5bf9\u5e94\u4e8eapplication\u3002 \u5ba2\u6237\u7aef\u9ed8\u8ba4\u4f1a\u8bfb\u53d6\u4e0b\u9762\u51e0\u4e2a\u5c42\u6b21\u7684\u914d\u7f6e\uff1a</p> <pre><code>* \u5e94\u7528\u7ea7\u914d\u7f6e\uff1agroup\u4e3aapplication\u540d\u79f0\uff0cdata-id\u4e3aapplication\u540d\u79f0\uff0c\u5e76\u4e14\u7c7b\u578b\u4e3ayaml\u7684\u914d\u7f6e\u3002\n* \u670d\u52a1\u7ea7\u914d\u7f6e\uff1agroup\u4e3aapplication\u540d\u79f0\uff0cdata-id\u4e3a\u5fae\u670d\u52a1\u540d\u79f0\uff0c\u5e76\u4e14\u7c7b\u578b\u4e3ayaml\u7684\u914d\u7f6e\u3002\n* \u7248\u672c\u7ea7\u914d\u7f6e\uff1agroup\u4e3aapplication\u540d\u79f0\uff0cdata-id\u4e3a\u5fae\u670d\u52a1\u540d\u79f0+\u7248\u672c\u53f7\uff0c\u5e76\u4e14\u7c7b\u578b\u4e3ayaml\u7684\u914d\u7f6e\uff0c \u6bd4\u5982: service-0.1\n* Profile\u7ea7\u914d\u7f6e\uff1agroup\u4e3aapplication\u540d\u79f0\uff0cdata-id\u4e3a\u5fae\u670d\u52a1\u540d\u79f0+Profile\u540d\u79f0\uff0c\u5e76\u4e14\u7c7b\u578b\u4e3ayaml\u7684\u914d\u7f6e\uff0c \u6bd4\u5982: service-dev\n* \u81ea\u5b9a\u4e49\u914d\u7f6e\uff1a\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u9879\u5b9a\u4e49group\u3001data-id\u3001\u7c7b\u578b\u7b49\u4fe1\u606f\uff0c\u8be6\u60c5\u53c2\u8003\u914d\u7f6e\u9879\u3002\u3002\n</code></pre> <p>\u4e0a\u8ff0\u7684\u914d\u7f6e\u7ea7\u522b\uff0c\u4f18\u5148\u7ea7\u4ece\u4f4e\u5230\u9ad8\u3002</p> <ul> <li>\u914d\u7f6e\u9879\u53c2\u8003</li> </ul> \u914d\u7f6e\u9879\u540d \u542b\u4e49 \u7f3a\u7701\u503c servicecomb.nacos.serverAddr NACOS\u8bbf\u95ee\u5730\u5740\uff0c\u683c\u5f0f\u4e3a<code>http(s)://{ip}:{port}</code>\uff0c\u4ee5<code>,</code>\u5206\u9694\u591a\u4e2a\u5730\u5740 \u7a7a servicecomb.nacos.group \u81ea\u5b9a\u4e49group \u7a7a servicecomb.nacos.dataId \u81ea\u5b9a\u4e49data-id \u7a7a servicecomb.nacos.addPrefix \u662f\u5426\u4f7f\u7528group+data-id\u4f5c\u4e3a\u914d\u7f6e\u9879\u524d\u7f00 false servicecomb.nacos.contentType \u81ea\u5b9a\u4e49\u7c7b\u578b yaml servicecomb.nacos.username \u8fde\u63a5Nacos\u7684\u7528\u6237\u540d \u7a7a servicecomb.nacos.password \u8fde\u63a5Nacos\u7684\u5bc6\u7801 \u7a7a servicecomb.nacos.accessKey \u8fde\u63a5Nacos\u7684Access Key \u7a7a servicecomb.nacos.secretKey \u8fde\u63a5Nacos\u7684Secret Key \u7a7a"},{"location":"config/read-config.html","title":"\u5728\u7a0b\u5e8f\u4e2d\u8bfb\u53d6\u914d\u7f6e\u4fe1\u606f","text":"<p>Java Chassis\u652f\u6301\u4f7f\u7528\u4e00\u81f4\u7684API\u83b7\u53d6\u914d\u7f6e\uff0c\u5f00\u53d1\u8005\u4e0d\u9700\u8981\u5173\u6ce8\u4ece\u54ea\u91cc\u8bfb\u53d6\u914d\u7f6e\u9879\u7684 \u503c\uff0cJava Chassis\u4f1a\u81ea\u52a8\u4ece\u5404\u5904\u8bfb\u53d6\u914d\u7f6e\uff0c\u5e76\u6309\u7167\u4f18\u5148\u7ea7\u8fdb\u884c\u5408\u5e76\u4ee5\u4fdd\u8bc1\u7528\u6237\u53d6\u5230\u7684\u662f\u4f18\u5148\u7ea7\u6700\u9ad8\u7684\u914d\u7f6e\u503c\u3002\u8bfb\u53d6\u914d\u7f6e\u4fe1\u606f\u652f\u6301\u4e0b\u9762\u51e0\u79cd\u4e0d\u540c\u7684\u65b9\u5f0f\u3002 </p>"},{"location":"config/read-config.html#spring-boot","title":"\u4f7f\u7528 Spring Boot \u7684\u914d\u7f6e\u673a\u5236\u8bfb\u53d6\u914d\u7f6e","text":"<p>Java Chassis\u7684\u914d\u7f6e\u4fe1\u606f\uff0c\u53ef\u4ee5\u901a\u8fc7Spring\u548cSpring Boot\u7684\u914d\u7f6e\u673a\u5236\u8fdb\u884c\u8bfb\u53d6\uff0c\u6bd4\u5982 <code>@Value</code>\u3001<code>@ConfigurationProperties</code>\u3001 <code>Environment</code> \u7b49\u3002 Java Chassis \u5c06\u914d\u7f6e\u5c42\u6b21\u5e94\u7528\u4e8eSpring Environment\u4e2d\uff0cSpring\u548cSpring Boot\u8bfb\u53d6\u914d\u7f6e\u7684\u65b9\u5f0f\uff0c\u4e5f\u80fd\u591f\u8bfb\u53d6\u5230<code>microservice.yaml</code>\u548c\u52a8\u6001\u914d\u7f6e\u7684\u503c\u3002</p> <p>\u6ce8\u610f\uff1a <code>@Value</code>\u3001<code>@ConfigurationProperties</code> \u4e24\u79cd\u4f7f\u7528\u65b9\u5f0f\uff0c\u5728\u52a8\u6001\u914d\u7f6e\u53d8\u5316\u7684\u65f6\u5019\uff0c\u503c\u4e0d\u4f1a\u53d8\u5316\u3002 \u4f7f\u7528 <code>Environment</code>, \u5728\u52a8\u6001\u914d\u7f6e\u53d8\u5316\u7684\u65f6\u5019\uff0c\u503c\u4f1a\u5b9e\u65f6\u53d8\u5316\u3002 </p>"},{"location":"config/read-config.html#dymamicproperties","title":"\u4f7f\u7528 <code>DymamicProperties</code> \u76d1\u542c\u914d\u7f6e\u53d8\u5316","text":"<p>\u6ce8\u5165 <code>DymamicProperties</code>\uff0c \u901a\u8fc7\u5176 API \u8bfb\u53d6\u914d\u7f6e\u548c\u76d1\u542c\u914d\u7f6e\u53d8\u5316\u3002 </p> <pre><code>@RestSchema(schemaId = \"ProviderController\")\n@RequestMapping(path = \"/\")\npublic class ProviderController {\n private DynamicProperties dynamicProperties;\n\n private String example;\n\n @Autowired\n public ProviderController(DynamicProperties dynamicProperties) {\n this.dynamicProperties = dynamicProperties;\n this.example = this.dynamicProperties.getStringProperty(\"basic.example\",\n value -&gt; this.example = value, \"not set\");\n }\n}\n</code></pre>"},{"location":"config/read-config.html#java-chassis","title":"\u4f7f\u7528 Java Chassis \u4f18\u5148\u7ea7\u914d\u7f6e","text":"<p>\u4f18\u5148\u7ea7\u914d\u7f6e\u63d0\u4f9b\u4e86\u4e00\u79cd\u7b80\u5355\u7684\u7ba1\u7406\u5927\u91cf\u590d\u6742\u914d\u7f6e\u7684\u673a\u5236\uff0c\u5f00\u53d1\u8005\u5b9a\u4e49\u4e00\u4e2a\u7b80\u5355\u7684 JAVA Bean\uff0c \u5b9a\u4e49\u8fd9\u4e2a Bean \u7684\u5c5e\u6027\u5bf9\u5e94\u7684\u914d\u7f6e\u9879\uff0c \u5f53\u914d\u7f6e\u4fe1\u606f\u53d8\u5316\u7684\u65f6\u5019\uff0c Bean \u7684\u5c5e\u6027\u4f1a\u81ea\u52a8\u5237\u65b0\uff0c\u6781\u5927 \u7684\u7b80\u5316\u4e86\u7528\u6237\u7ba1\u7406\u5927\u91cf\u590d\u6742\u914d\u7f6e\u7684\u590d\u6742\u5ea6\u3002 </p> <p>Bean \u5c5e\u6027\u5bf9\u5e94\u7684\u914d\u7f6e\u9879\u540d\u79f0\u652f\u6301\u901a\u914d\u7b26\uff0c \u4e00\u4e2a\u5c5e\u6027\u53ef\u4ee5\u5173\u8054\u82e5\u5e72\u914d\u7f6e\u9879\uff0c\u53ef\u4ee5\u58f0\u660e\u8fd9\u4e9b\u914d\u7f6e\u9879\u7684\u4f18\u5148\u7ea7\u3002 Java\u5bf9\u8c61\u53ef\u4ee5\u662f\u4e00\u4e2a Java Bean\uff0c\u6216\u662f\u4e00\u4e2a\u62e5\u6709public\u5b57\u6bb5\u7684\u7c7b\u3002</p> <ul> <li>\u914d\u7f6e\u6ce8\u5165\u5bf9\u8c61</li> </ul> <p>\u6211\u4eec\u9996\u5148\u8bbe\u8ba1\u4e24\u4e2aJava\u7c7b\u7528\u4e8e\u6ce8\u5165\u914d\u7f6e\u5c5e\u6027\uff0c\u5206\u522b\u7528\u6765\u6f14\u793a\u4e0d\u4f7f\u7528\u6ce8\u89e3\u548c\u4f7f\u7528\u6ce8\u89e3\u7684\u573a\u666f\u3002\u4f7f\u7528@InjectProperties\u6ce8\u89e3\u5e76\u58f0\u660e\u4e3aBean:</p> <pre><code> ```Java\n @Component\n @InjectProperties(prefix = \"jaxrstest.jaxrsclient\")\n public class Configuration {\n /*\n * \u65b9\u6cd5\u7684 prefix \u5c5e\u6027\u503c \"override\" \u4f1a\u8986\u76d6\u6807\u6ce8\u5728\u7c7b\u5b9a\u4e49\u7684 @InjectProperties\n * \u6ce8\u89e3\u7684 prefix \u5c5e\u6027\u503c\u3002\n *\n * keys\u5c5e\u6027\u53ef\u4ee5\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\u6570\u7ec4\uff0c\u4e0b\u6807\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8\u3002\n *\n * \u8fd9\u91cc\u4f1a\u6309\u7167\u5982\u4e0b\u987a\u5e8f\u7684\u5c5e\u6027\u540d\u79f0\u67e5\u627e\u914d\u7f6e\u5c5e\u6027\uff0c\u76f4\u5230\u627e\u5230\u5df2\u88ab\u914d\u7f6e\u7684\u914d\u7f6e\u5c5e\u6027\uff0c\u5219\u505c\u6b62\u67e5\u627e\uff1a\n * 1) jaxrstest.jaxrsclient.override.high\n * 2) jaxrstest.jaxrsclient.override.low\n *\n * \u6d4b\u8bd5\u7528\u4f8b\uff1a\n * jaxrstest.jaxrsclient.override.high: hello high\n * jaxrstest.jaxrsclient.override.low: hello low\n * \u9884\u671f\uff1a\n * hello high\n */\n @InjectProperty(prefix = \"jaxrstest.jaxrsclient.override\", keys = {\"high\", \"low\"})\n public String strValue;\n\n /**\n * keys\u652f\u6301\u901a\u914d\u7b26\uff0c\u5e76\u5728\u53ef\u4ee5\u5728\u5c06\u914d\u7f6e\u5c5e\u6027\u6ce8\u5165\u7684\u65f6\u5019\u6307\u5b9a\u901a\u914d\u7b26\u7684\u4ee3\u5165\u5bf9\u8c61\u3002\n *\n * \u6d4b\u8bd5\u7528\u4f8b\uff1a\n * jaxrstest.jaxrsclient.k.value: 3\n * \u9884\u671f\uff1a\n * 3\n */\n @InjectProperty(keys = \"${key}.value\")\n public int intValue;\n\n /**\n * \u901a\u914d\u7b26\u7684\u4ee3\u5165\u5bf9\u8c61\u53ef\u4ee5\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32List\uff0c\u4f18\u5148\u7ea7\u9075\u5faa\u6570\u7ec4\u5143\u7d20\u4e0b\u6807\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8\u7b56\u7565\u3002\n *\n * \u6d4b\u8bd5\u7528\u4f8b\uff1a\n * jaxrstest.jaxrsclient.l1-1: 3.0\n * jaxrstest.jaxrsclient.l1-2: 2.0\n *\n * \u9884\u671f\uff1a\n * 3.0\n */\n @InjectProperty(keys = \"${full-list}\")\n public float floatValue;\n\n /**\n * keys\u5c5e\u6027\u4e5f\u652f\u6301\u591a\u4e2a\u901a\u914d\u7b26\uff0c\u4f18\u5148\u7ea7\u5982\u4e0b\uff1a\u9996\u5148\u901a\u914d\u7b26\u7684\u4f18\u5148\u7ea7\u4ece\u5de6\u5230\u53f3\u9012\u51cf\uff0c\n * \u7136\u540e\u5982\u679c\u901a\u914d\u7b26\u88ab\u4ee3\u5165List\uff0c\u9075\u5faaList\u4e2d\u5143\u7d20index\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8\u7b56\u7565\u3002\n *\n * \u6d4b\u8bd5\u7528\u4f8b\uff1a\n * jaxrstest.jaxrsclient.low-1.a.high-1.b: 1\n * jaxrstest.jaxrsclient.low-1.a.high-2.b: 2\n * jaxrstest.jaxrsclient.low-2.a.high-1.b: 3\n * jaxrstest.jaxrsclient.low-2.a.high-2.b: 4\n * \u9884\u671f\uff1a\n * 1\n */\n @InjectProperty(keys = \"${low-list}.a.${high-list}.b\")\n public long longValue;\n\n /**\n * \u53ef\u4ee5\u901a\u8fc7\u6ce8\u89e3\u7684defaultValue\u5c5e\u6027\u6307\u5b9a\u9ed8\u8ba4\u503c\u3002\u5982\u679c\u5b57\u6bb5\u672a\u5173\u8054\u4efb\u4f55\u914d\u7f6e\u5c5e\u6027\uff0c\n * \u5b9a\u4e49\u7684\u9ed8\u8ba4\u503c\u4f1a\u751f\u6548\uff0c\u5426\u5219\u9ed8\u8ba4\u503c\u4f1a\u88ab\u8986\u76d6\u3002\n *\n * \u6d4b\u8bd5\u7528\u4f8b\uff1a\n * \u9884\u671f\uff1a\n * abc\n */\n @InjectProperty(defaultValue = \"abc\")\n public String strDef;\n }\n ```\n</code></pre> <p>Configuration\u5bf9\u8c61\u7684longValue\u5b57\u6bb5\u6309\u4ee5\u4e0b\u987a\u5e8f\u67e5\u627e\u5df2\u914d\u7f6e\u7684\u5c5e\u6027:</p> <pre><code> 1. root.low-1.a.high-1.b\n 2. root.low-1.a.high-2.b\n 3. root.low-2.a.high-1.b\n 4. root.low-2.a.high-2.b\n</code></pre> <p>Configuration\u5bf9\u8c61\u7684floatValue\u5b57\u6bb5\u6309\u4ee5\u4e0b\u987a\u5e8f\u67e5\u627e\u5df2\u914d\u7f6e\u7684\u5c5e\u6027:</p> <pre><code> 1. root.l1-1\n 2. root.l1-2\n</code></pre> <p>\u4e0d\u4f7f\u7528\u6ce8\u89e3\uff1a</p> <pre><code> ```Java\n @Component\n @InjectProperties(prefix = \"jaxrstest.jaxrsclient\")\n public class ConfigNoAnnotation {\n /*\n * \u5982\u679c\u672a\u63d0\u4f9b@InjectProperties\u548c@InjectProperty\u6ce8\u89e3\uff0c\u4f1a\u9ed8\u8ba4\u4f7f\u7528\u5b57\u6bb5\u540d\u4f5c\u4e3a\u914d\u7f6e\u5c5e\u6027\u540d\u3002\n * \u6ce8\u610f\u7c7b\u540d\u4e0d\u4f5c\u4e3a\u524d\u7f00\u8d77\u4f5c\u7528\u3002\n * \u6b64\u5904\u5c06\u914d\u7f6e\u5c5e\u6027 strValue \u7ed1\u5b9a\u5230\u8be5\u5b57\u6bb5\n */\n public String strValue;\n }\n ```\n</code></pre> <p>ConfigNoAnnotation \u5bf9\u8c61\u7684 strValue \u5b57\u6bb5\u4f1a\u67e5\u627e\u5df2\u914d\u7f6e\u7684\u5c5e\u6027 strValue\uff0c\u6ca1\u6709\u524d\u7f00\u548c\u4f18\u5148\u7ea7\u3002</p> <p>\u66f4\u591a\u5173\u4e8e\u914d\u7f6e\u6ce8\u5165\u7684\u7528\u6cd5\uff0c\u5efa\u8bae\u4e0b\u8f7d java-chassis \u7684\u6e90\u7801\uff0c \u67e5\u770b TestConfigObjectFactory \u7c7b\u91cc\u9762\u7684\u793a\u4f8b\u3002</p>"},{"location":"config/zookeeper.html","title":"\u4f7f\u7528 Zookeeper","text":""},{"location":"config/zookeeper.html#_1","title":"\u4e0b\u8f7d\u5b89\u88c5","text":"<p>\u53ef\u4ee5\u901a\u8fc7 ZooKeeper\u5b98\u7f51 \u4e0b\u8f7d\u548c\u5b89\u88c5 ZooKeeper\u3002</p>"},{"location":"config/zookeeper.html#_2","title":"\u5f00\u53d1\u4f7f\u7528","text":"<p>\u4f7f\u7528ZooKeeper\uff0c\u9700\u8981\u5728\u9879\u76ee\u4e2d\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;config-zookeeper&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u7136\u540e\u5728\u914d\u7f6e\u6587\u4ef6 microservice.yaml \u4e2d\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n config:\n zk:\n connectString: 127.0.0.1:2181\n</code></pre> <ul> <li>\u914d\u7f6e\u4e2d\u5fc3\u589e\u52a0\u914d\u7f6e</li> </ul> <p>ZooKeeper \u4f7f\u7528\u4e0b\u9762\u7684\u914d\u7f6e\u7ed3\u6784\u548c\u73af\u5883\uff08Environment\uff09\u3001\u5e94\u7528\uff08Application\uff09\u3001\u670d\u52a1\uff08Service\uff09\u3001\u7248\u672c\uff08Version\uff09\u3001Tag\u5bf9\u5e94\uff0c \u914d\u7f6e\u7ea7\u522b\u4f18\u5148\u7ea7\u4ece\u4f4e\u5230\u9ad8\u3002 </p> <pre><code>servicecomb:\n config:\n environment: \n ${environment}:\n exampleText: exampleTextValue\n exampleYaml.yaml: exampleYamlValue\n exampleYaml.yml: exampleYamlValue\n exampleProperties.properties: examplePropertiesValue\n application:\n ${environment}:\n ${application}:\n exampleText: exampleTextValue\n exampleYaml.yaml: exampleYamlValue\n exampleYaml.yml: exampleYamlValue\n exampleProperties.properties: examplePropertiesValue\n service:\n ${environment}:\n ${application}:\n ${service}:\n exampleText: exampleTextValue\n exampleYaml.yaml: exampleYamlValue\n exampleYaml.yml: exampleYamlValue\n exampleProperties.properties: examplePropertiesValue\n version:\n ${environment}:\n ${application}:\n ${service}:\n ${version}:\n exampleText: exampleTextValue\n exampleYaml.yaml: exampleYamlValue\n exampleYaml.yml: exampleYamlValue\n exampleProperties.properties: examplePropertiesValue\n tag:\n ${environment}:\n ${application}:\n ${service}:\n ${tag}:\n exampleText: exampleTextValue\n exampleYaml.yaml: exampleYamlValue\n exampleYaml.yml: exampleYamlValue\n exampleProperties.properties: examplePropertiesValue\n</code></pre> <ul> <li>\u914d\u7f6e\u9879\u53c2\u8003</li> </ul> \u914d\u7f6e\u9879\u540d \u9ed8\u8ba4\u503c \u662f\u5426\u5fc5\u987b \u542b\u4e49 servicecomb.config.zk.connect-string 127.0.0.1:2181 \u662f ZooKeeper\u7684\u5730\u5740\u4fe1\u606f\uff0c\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a\uff0c\u7528\u9017\u53f7\u5206\u9694\u3002 servicecomb.config.zk.authenticationSchema \u7a7a \u5426 \u8ba4\u8bc1\u65b9\u5f0f\uff0c\u76ee\u524d\u53ea\u80fd\u914d\u7f6e\u4e3a digest\u3002 servicecomb.config.zk.authenticationInfo \u7a7a \u5426 \u5f53\u8ba4\u8bc1\u65b9\u5f0f\u4e3a digest \u7684\u65f6\u5019\uff0c\u914d\u7f6e\u7528\u6237\u540d\u5bc6\u7801\u4fe1\u606f\uff0c\u6bd4\u5982: user:password servicecomb.config.zk.connectionTimeoutMillis 1000 \u5426 \u8fde\u63a5\u8d85\u65f6\u65f6\u95f4 servicecomb.config.zk.sessionTimeoutMillis 60000 \u5426 \u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4"},{"location":"config-reference/rest-transport-client.html","title":"REST Transport Client \u914d\u7f6e\u9879","text":"<ul> <li>\u57fa\u672c\u914d\u7f6e</li> </ul> <p>REST Trasnport Client \u5206\u4e3a HTTP \u548c HTTP2, \u5b83\u4eec\u5171\u4eab\u5f88\u591a\u914d\u7f6e\u9879\u3002\u4e0b\u8868\u4e2d\u914d\u7f6e\u9879\u540d\u79f0\u5305\u542b <code>http2</code> \u7684\u914d\u7f6e\u9879\uff0c \u662f HTTP2 \u72ec\u6709\u7684\u3002 HTTP2\u534f\u8bae\u4f9d\u8d56\u4e8eHTTP\u534f\u8bae\uff0cHTTP\u548cHTTP2\u7684\u8fde\u63a5\u6c60\u662f\u5171\u4eab\u7684\uff0c\u5728\u4f7f\u7528HTTP2\u7684\u60c5\u51b5\u4e0b\uff0c\u540c\u6837\u9700\u8981\u914d\u7f6eHTTP\u7684\u8fde\u63a5\u6c60\u53c2\u6570\u3002\u6bd4\u5982\uff1a</p> <pre><code>servicecomb:\n rest:\n client:\n connection:\n maxPoolSize: 50\n http2:\n maxPoolSize: 5\n</code></pre> <p>\u8fde\u63a5\u6c60\u5728\u8ba1\u7b97\u662f\u5426\u8d85\u8fc7\u5927\u5c0f\u7684\u65f6\u5019\uff0c\u4f1a\u540c\u65f6\u68c0\u67e5\u8fd9\u4e24\u4e2a\u914d\u7f6e\u9879\u3002\u5047\u8bbe\u8bbf\u95ee\u7684\u670d\u52a1\u5668\u4e3aH\uff0c\u90a3\u4e48\u4e0a\u8ff0\u914d\u7f6e\uff0c\u548cH\u5efa\u7acb\u7684\u6700\u5927\u8fde\u63a5\u53ef\u80fd\u6027\u4e3a HTTP:HTTP2=50:0, HTTP:HTTP2=0:5, HTTP:HTTP2=20:3\u7b49\u3002\u4e00\u4e2a\u5ba2\u6237\u7aef\u548cH\u5efa\u7acb\u7684\u603b\u7684\u8fde\u63a5\u6570\u8fd8\u548cservicecomb.rest.client.verticle-count \u6709\u5173\u3002\u53ef\u4ee5\u7406\u89e3\u4e3a\u6bcf\u4e2avertical\u4f1a\u9488\u5bf9H\u521b\u5efa\u4e00\u4e2a\u8fde\u63a5\u6c60\uff0c\u8fde\u63a5\u6c60\u4e2a\u6570\u4e3avertical-count\u3002</p> <p>\u7531\u4e8eHTTP\u548cHTTP2\u534f\u8bae\u4e4b\u95f4\u8fd9\u79cd\u7d27\u5bc6\u7684\u5173\u7cfb\uff0c\u5728\u4f7f\u7528HTTP2\u7684\u60c5\u51b5\u4e0b\uff0c\u5176\u4ed6\u76f8\u5173\u7684HTTP\u53c2\u6570\u5efa\u8bae\u4e00\u5e76\u9700\u8981\u5408\u7406\u8bbe\u7f6e\uff0c\u6bd4\u5982\u8fde\u63a5\u95f2\u7f6e\u8d85\u65f6\u65f6\u95f4\u7b49\u3002</p> \u914d\u7f6e\u9879\u540d\u79f0 \u7248\u672c \u7f3a\u7701\u503c \u529f\u80fd\u63cf\u8ff0 servicecomb.rest.client.enabled 2.0.2 true \u662f\u5426\u542f\u7528Rest Transport Client, HTTP 1 servicecomb.rest.client.verticle-count \u5907\u6ce81 \u5907\u6ce82 servicecomb.rest.client.thread-count \u5e9f\u5f03 \u540cverticle-count servicecomb.rest.client.connection.timeoutInMillis 2.0.2 1000 \u8fde\u63a5\u8d85\u65f6\u65f6\u95f4 servicecomb.rest.client.connection.idleTimeoutInSeconds 30 HTTP \u8fde\u63a5\u95f2\u7f6e\u8d85\u65f6\u65f6\u95f4 servicecomb.rest.client.connection.compression false \u662f\u5426\u542f\u7528\u538b\u7f29 servicecomb.rest.client.maxWaitQueueSize -1 HTTP HTTP2 \u7b49\u5f85\u961f\u5217\u5927\u5c0f servicecomb.rest.client.connection.maxPoolSize 5 HTTP \u5ba2\u6237\u7aef\u8fde\u63a5\u6c60\u5927\u5c0f servicecomb.rest.client.connection.keepAlive true HTTP \u8fde\u63a5\u662f\u5426\u4fdd\u6d3b servicecomb.rest.client.maxHeaderSize 8192 HTTP \u6700\u5927\u5934\u90e8\u9650\u5236 servicecomb.rest.client.http2.enabled 2.0.2 true \u662f\u5426\u542f\u7528Rest Transport Client\uff0cHTTP 2 servicecomb.rest.client.http2.useAlpnEnabled true servicecomb.rest.client.http2.multiplexingLimit -1 \u4e00\u6761\u8fde\u63a5\u4e2d\uff0c\u540c\u65f6\u652f\u6301\u7684\u6700\u5927\u7684stream\u5e76\u53d1\u91cf\uff0c-1\u8868\u793a\u4e0d\u9650\u5236\u3002\u6700\u7ec8\u4ee5\u670d\u52a1\u7aef\u7684concurrentStreams\u548c\u5ba2\u6237\u7aef\u7684multiplexingLimit\u8f83\u5c0f\u503c\u4e3a\u51c6\u3002 servicecomb.rest.client.http2.maxPoolSize 1 HTTP2 \u5ba2\u6237\u7aef\u8fde\u63a5\u6c60\u5927\u5c0f servicecomb.rest.client.http2.idleTimeoutInSeconds 2.0.1 0 HTTP2 \u8fde\u63a5\u95f2\u7f6e\u8d85\u65f6\u65f6\u95f4 <ul> <li>\u8bf7\u6c42\u8d85\u65f6\u914d\u7f6e</li> </ul> <p>\u53ef\u4ee5\u9488\u5bf9\u6bcf\u4e2a\u5177\u4f53\u7684\u63a5\u53e3\u8bbe\u7f6e\u8d85\u65f6\uff0c\u914d\u7f6e\u9879 <code>request.${op-any-priority}.timeout</code> \uff0c \u5355\u4f4d\u662f\u6beb\u79d2\uff0c\u9ed8\u8ba4 30000\u3002 \u4e3e\u4f8b\uff1a</p> <pre><code> servicecomb.request.timeout=30000\n servicecomb.request.MyService.timeout=40000\n servicecomb.request.MyService.MySchema.MyOperation.timeout=50000\n</code></pre> <ul> <li>SSL \u914d\u7f6e</li> </ul> <p>\u53c2\u8003 \u4f7f\u7528TLS\u901a\u4fe1\u3002 tag \u4e3a <code>rest.consumer</code>\u3002</p> <ul> <li>Proxy \u914d\u7f6e</li> </ul> <p>\u4e0d\u652f\u6301\u3002</p> <p>\u5907\u6ce8:</p> <ol> <li> <p> \u5982\u679cCPU\u6570\u5c0f\u4e8e8\uff0c\u5219\u53d6CPU\u6570\u3002\u5982\u679cCPU\u6570\u5927\u4e8e\u7b49\u4e8e8\uff0c\u5219\u4e3a8\u3002</p> </li> <li> <p> java-chassis \u9ed8\u8ba4\u91c7\u7528 vert.x \u7684 HTTP Client \u529f\u80fd\uff0c\u8fd9\u4e2a\u914d\u7f6e\u9879\u5bf9\u5e94\u7684\u662f verticle instances \u6570\u91cf\u3002 verticle instances \u6570\u91cf \u4f1a\u5f71\u54cd\u5e76\u53d1\u8d44\u6e90\u5206\u914d\u3002\u6bd4\u5982\uff1a \u5982\u679c verticle instances \u4e3a 2\uff0c maxPoolSize \u4e3a 5\uff0c \u90a3\u4e48\u5b9e\u9645\u521b\u5efa\u7684\u8fde\u63a5\u6570\u4e3a 2*5=10\u3002</p> </li> </ol>"},{"location":"edge/by-servicecomb-sdk.html","title":"\u4f7f\u7528 Edge Service \u505a\u7f51\u5173","text":"<p>Edge Service \u662fServiceComb \u63d0\u4f9b\u7684JAVA\u7f51\u5173\u670d\u52a1\u5f00\u53d1\u6846\u67b6\u3002Edge Service\u4f5c\u4e3a\u6574\u4e2a\u5fae\u670d\u52a1\u7cfb\u7edf\u5bf9\u5916\u7684\u63a5\u53e3\uff0c\u5411\u6700\u7ec8\u7528\u6237\u63d0\u4f9b\u670d\u52a1\uff0c\u63a5\u5165REST\u8bf7\u6c42\uff0c\u8f6c\u53d1\u7ed9\u5185\u90e8\u5fae\u670d\u52a1\uff0cEdge Service\u652f\u6301REST\u8bf7\u6c42\u548cHighway\u8bf7\u6c42\u7684\u8f6c\u53d1\u3002Edge Service\u4ee5\u5f00\u53d1\u6846\u67b6\u7684\u5f62\u5f0f\u63d0\u4f9b\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u975e\u5e38\u7b80\u5355\u7684\u642d\u5efa\u4e00\u4e2aEdge Service\u670d\u52a1\uff0c\u901a\u8fc7\u7b80\u5355\u7684\u914d\u7f6e\u5c31\u53ef\u4ee5\u5b9a\u4e49\u8def\u7531\u8f6c\u53d1\u89c4\u5219\u3002\u540c\u65f6Edge Service\u652f\u6301\u5f3a\u5927\u7684\u6269\u5c55\u80fd\u529b\uff0c\u670d\u52a1\u6620\u5c04\u3001\u8bf7\u6c42\u89e3\u6790\u3001\u52a0\u5bc6\u89e3\u5bc6\u3001\u9274\u6743\u7b49\u903b\u8f91\u90fd\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u5b9e\u73b0\u3002</p> <p>Edge Service \u672c\u8eab\u4e5f\u662f\u4e00\u4e2a\u5fae\u670d\u52a1\uff0c\u9700\u9075\u5b88\u6240\u6709\u5fae\u670d\u52a1\u5f00\u53d1\u7684\u89c4\u5219\u3002\u5176\u672c\u8eab\u53ef\u4ee5\u90e8\u7f72\u4e3a\u591a\u5b9e\u4f8b\uff0c\u524d\u7aef\u4f7f\u7528\u8d1f\u8f7d\u5747\u8861\u88c5\u7f6e\u8fdb\u884c\u8d1f\u8f7d\u5206\u53d1\uff1b\u4e5f\u53ef\u4ee5\u90e8\u7f72\u4e3a\u4e3b\u5907\uff0c\u76f4\u63a5\u63a5\u5165\u7528\u6237\u8bf7\u6c42\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u6839\u636eEdge Service\u627f\u8f7d\u7684\u903b\u8f91\u548c\u4e1a\u52a1\u8bbf\u95ee\u91cf\u3001\u7ec4\u7f51\u60c5\u51b5\u6765\u89c4\u5212\u3002</p>"},{"location":"edge/by-servicecomb-sdk.html#edge-service_1","title":"\u5f00\u53d1 Edge Service \u670d\u52a1","text":"<p>\u5f00\u53d1 Edge Service \u548c\u5f00\u53d1\u4e00\u4e2a\u666e\u901a\u7684\u5fae\u670d\u52a1\u6b65\u9aa4\u5dee\u4e0d\u591a\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u4ece\u5bfc\u5165ServiceComb Edge Service Samples\u5165\u624b\u3002\u4ece\u5934\u642d\u5efa\u9879\u76ee\u5305\u542b\u5982\u4e0b\u51e0\u4e2a\u6b65\u9aa4\uff1a</p> <ul> <li>\u914d\u7f6e\u4f9d\u8d56\u5173\u7cfb</li> </ul> <p>\u5728\u9879\u76ee\u4e2d\u52a0\u5165edge-core\u7684\u4f9d\u8d56\uff0c\u5c31\u53ef\u4ee5\u542f\u52a8Edge Service\u7684\u529f\u80fd\u3002</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-standalone&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;edge-core&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre> <ul> <li>\u5b9a\u4e49\u542f\u52a8\u7c7b</li> </ul> <p>\u548c\u5f00\u53d1\u666e\u901a\u5fae\u670d\u52a1\u4e00\u6837\uff0c\u53ef\u4ee5\u901a\u8fc7 <code>@EnableServiceComb</code> \u7684\u65b9\u5f0f\u5c06\u670d\u52a1\u62c9\u8d77\u6765\u3002</p> <pre><code>@SpringBootApplication\n@EnableServiceComb\npublic class GatewayApplication {\n public static void main(String[] args) throws Exception {\n try {\n new SpringApplicationBuilder().web(WebApplicationType.NONE).sources(GatewayApplication.class).run(args);\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}\n</code></pre> <ul> <li>\u589e\u52a0\u914d\u7f6e\u6587\u4ef6 microservice.yaml</li> </ul> <p>Edge Service\u672c\u8eab\u4e5f\u662f\u4e00\u4e2a\u5fae\u670d\u52a1\uff0c\u9075\u5faa\u5fae\u670d\u52a1\u67e5\u627e\u7684\u89c4\u5219\uff0c\u81ea\u5df1\u4e5f\u4f1a\u8fdb\u884c\u6ce8\u518c\u3002\u6ce8\u610f <code>application</code> \u4e0e\u9700\u8981\u8f6c\u53d1\u7684\u5fae\u670d\u52a1\u76f8\u540c\u3002\u5728\u4e0b\u9762\u7684\u914d\u7f6e\u4e2d\uff0c\u6307\u5b9a\u4e86Edge Service\u76d1\u542c\u7684\u5730\u5740\uff0c\u5904\u7406\u94fe\u7b49\u4fe1\u606f\u3002\u5176\u4e2dauth\u5904\u7406\u94fe\u662fDEMO\u9879\u76ee\u4e2d\u81ea\u5b9a\u4e49\u7684\u5904\u7406\u94fe\uff0c\u7528\u4e8e\u5b9e\u73b0\u8ba4\u8bc1\u3002\u540c\u65f6auth\u670d\u52a1\u672c\u8eab\uff0c\u4e0d\u7ecf\u8fc7\u8fd9\u4e2a\u5904\u7406\u94fe\uff0c\u76f8\u5f53\u4e8e\u4e0d\u9274\u6743\u3002</p> <pre><code>servicecomb:\n service:\n application: edge\n name: edge\n version: 0.0.1\n registry:\n address: http://127.0.0.1:30100\n rest:\n address: 127.0.0.1:18080\n handler:\n chain:\n Consumer:\n default: auth,loadbalance\n service:\n auth: loadbalance\n</code></pre>"},{"location":"edge/by-servicecomb-sdk.html#_1","title":"\u5de5\u4f5c\u6d41\u7a0b","text":"<p>Edge Service\u7684\u5de5\u4f5c\u6d41\u7a0b\u5982\u4e0b\uff0c\u84dd\u8272\u80cc\u666f\u90e8\u5206\u5728Eventloop\u7ebf\u7a0b\u4e2d\u6267\u884c\uff0c\u9ec4\u8272\u80cc\u666f\u90e8\u5206\uff1a * \u5982\u679c\u5de5\u4f5c\u4e8ereactive\u6a21\u5f0f\uff0c\u5219\u76f4\u63a5\u5728Eventloop\u7ebf\u7a0b\u6267\u884c * \u5982\u679c\u5de5\u4f5c\u4e8e\u7ebf\u7a0b\u6c60\u6a21\u5f0f\uff0c\u5219\u5728\u7ebf\u7a0b\u6c60\u7684\u7ebf\u7a0b\u4e2d\u6267\u884c </p>"},{"location":"edge/by-servicecomb-sdk.html#header","title":"\u5b9a\u5236\u516c\u5171\u8f6c\u53d1 Header","text":"<p>Edge Service \u5728\u8f6c\u53d1\u8bf7\u6c42\u7684\u65f6\u5019, \u4f1a\u9ed8\u8ba4\u8fc7\u6ee4\u6389 <code>\u516c\u5171\u8bf7\u6c42\u5934</code> \u3002 \u4e5f\u5c31\u662f\u9664\u4e86 Provider \u7aef\u663e\u793a \u58f0\u660e\u9700\u8981\u7684 <code>HEADER</code> \u5916\uff0c \u5176\u4ed6\u7684 header \u5728\u8f6c\u53d1\u7684\u65f6\u5019\u90fd\u4f1a\u4e22\u5931\u3002\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u76f8\u5173\u53c2\u6570\u4fdd\u7559 \u516c\u5171\u8bf7\u6c42\u5934\u3002</p> <pre><code>servicecomb:\n edge:\n filter:\n addHeader:\n # \u5f00\u542f \u516c\u5171\u8bf7\u6c42\u5934\u4fdd\u7559\u529f\u80fd\u3002\u9ed8\u8ba4 false\n enabled: true\n # \u8981\u4fdd\u7559\u7684\u516c\u5171\u8bf7\u6c42\u5934\uff0c\u4ee5\u9017\u53f7\u9694\u5f00\n allowedHeaders: external_1,external_2\n</code></pre> <p>\u5982\u679c\u5bf9\u63a5\u4e86\u914d\u7f6e\u4e2d\u5fc3\uff0c \u53ef\u4ee5\u5728\u914d\u7f6e\u4e2d\u5fc3\u52a8\u6001\u4fee\u6539 \u914d\u7f6e <code>servicecomb.edge.filter.addHeader.enabled</code> \u548c <code>servicecomb.edge.filter.addHeader.allowedHeaders</code> \uff0c \u914d\u7f6e\u52a8\u6001\u751f\u6548\u3002</p>"},{"location":"edge/by-servicecomb-sdk.html#_2","title":"\u5b9a\u5236\u8def\u7531\u89c4\u5219","text":"<p>\u4f7f\u7528Edge Service\u7684\u6838\u5fc3\u5de5\u4f5c\u662f\u914d\u7f6e\u8def\u7531\u89c4\u5219\u3002\u573a\u666f\u4e0d\u540c\uff0c\u89c4\u5219\u4e5f\u4e0d\u540c\u3002 \u8def\u7531\u89c4\u5219\u7531\u4e00\u7cfb\u5217AbstractEdgeDispatcher\u7ec4\u6210\u3002Edge Service\u63d0\u4f9b\u4e86\u51e0\u4e2a\u5e38\u89c1\u7684Dispatcher\uff0c\u901a\u8fc7\u914d\u7f6e\u5373\u53ef\u542f\u7528\uff0c\u5982\u679c\u8fd9\u4e9bDispatcher\u4e0d\u6ee1\u8db3\u4e1a\u52a1\u573a\u666f\u9700\u8981\uff0c\u8fd8\u53ef\u4ee5\u81ea\u5b9a\u4e49\u3002</p> <ul> <li>\u4f7f\u7528 DefaultEdgeDispatcher</li> </ul> <p>DefaultEdgeDispatcher\u662f\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u3001\u5bb9\u6613\u7ba1\u7406\u7684Dispatcher\uff0c\u4f7f\u7528\u8fd9\u4e2aDispatcher\uff0c\u7528\u6237\u4e0d\u7528\u52a8\u6001\u7ba1\u7406\u8f6c\u53d1\u89c4\u5219\uff0c\u5e94\u7528\u4e8e\u5b9e\u9645\u7684\u4e1a\u52a1\u573a\u666f\u975e\u5e38\u65b9\u4fbf\uff0c\u8fd9\u4e2a\u4e5f\u662f\u63a8\u8350\u7684\u4e00\u79cd\u7ba1\u7406\u673a\u5236\u3002\u5b83\u5305\u542b\u5982\u4e0b\u51e0\u4e2a\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n http:\n dispatcher:\n edge:\n default:\n enabled: true\n prefix: rest\n withVersion: true\n prefixSegmentCount: 1\n</code></pre> <p>\u5e38\u89c1\u7684\u8fd9\u4e9b\u914d\u7f6e\u9879\u7684\u793a\u4f8b\u53ca\u542b\u4e49\u5982\u4e0b:</p> <ul> <li>[prefix=rest;withVersion=true;prefixSegmentCount=1]\u5fae\u670d\u52a1xService\u63d0\u4f9b\u7684URL\u4e3a: /xService/v1/abc\uff0c\u901a\u8fc7Edge\u8bbf\u95ee\u7684\u5730\u5740\u4e3a/rest/xService/v1/abc\uff0c\u8bf7\u6c42\u53ea\u8f6c\u53d1\u5230[1.0.0-2.0.0)\u7248\u672c\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002</li> <li>[prefix=rest;withVersion=true;prefixSegmentCount=2]\u5fae\u670d\u52a1xService\u63d0\u4f9b\u7684URL\u4e3a: /v1/abc\uff0c\u901a\u8fc7Edge\u8bbf\u95ee\u7684\u5730\u5740\u4e3a/rest/xService/v1/abc\uff0c\u8bf7\u6c42\u53ea\u8f6c\u53d1\u5230[1.0.0-2.0.0)\u7248\u672c\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002</li> <li>[prefix=rest;withVersion=true;prefixSegmentCount=3]\u5fae\u670d\u52a1xService\u63d0\u4f9b\u7684URL\u4e3a: /abc\uff0c\u901a\u8fc7Edge\u8bbf\u95ee\u7684\u5730\u5740\u4e3a/rest/xService/v1/abc\uff0c\u8bf7\u6c42\u53ea\u8f6c\u53d1\u5230[1.0.0-2.0.0)\u7248\u672c\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002</li> <li>[prefix=rest;withVersion=false;prefixSegmentCount=1]\u5fae\u670d\u52a1xService\u63d0\u4f9b\u7684URL\u4e3a: /xService/v1/abc\uff0c\u901a\u8fc7Edge\u8bbf\u95ee\u7684\u5730\u5740\u4e3a/rest/xService/v1/abc\uff0c\u8bf7\u6c42\u53ef\u80fd\u8f6c\u53d1\u5230\u4efb\u610f\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002</li> <li>[prefix=rest;withVersion=false;prefixSegmentCount=2]\u5fae\u670d\u52a1xService\u63d0\u4f9b\u7684URL\u4e3a: /v1/abc\uff0c\u901a\u8fc7Edge\u8bbf\u95ee\u7684\u5730\u5740\u4e3a/rest/xService/v1/abc\uff0c\uff0c\u8bf7\u6c42\u53ef\u80fd\u8f6c\u53d1\u5230\u4efb\u610f\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002</li> <li>[prefix=rest;withVersion=false;prefixSegmentCount=2]\u5fae\u670d\u52a1xService\u63d0\u4f9b\u7684URL\u4e3a: /abc\uff0c\u901a\u8fc7Edge\u8bbf\u95ee\u7684\u5730\u5740\u4e3a/rest/xService/abc\uff0c\uff0c\u8bf7\u6c42\u53ef\u80fd\u8f6c\u53d1\u5230\u4efb\u610f\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002</li> </ul> <p>withVersion\u914d\u7f6e\u9879\u63d0\u4f9b\u4e86\u5ba2\u6237\u7aef\u7070\u5ea6\u89c4\u5219\uff0c\u53ef\u4ee5\u8ba9\u5ba2\u6237\u7aef\u6307\u5b9a\u8bbf\u95ee\u7684\u670d\u52a1\u7aef\u7248\u672c\u3002Edge Service\u8fd8\u5305\u542b\u6839\u636e\u63a5\u53e3\u517c\u5bb9\u6027\u81ea\u52a8\u8def\u7531\u7684\u529f\u80fd\uff0c\u8bf7\u6c42\u4f1a\u8f6c\u53d1\u5230\u5305\u542b\u4e86\u8be5\u63a5\u53e3\u7684\u5b9e\u4f8b\u3002\u5047\u8bbe\u67d0\u5fae\u670d\u52a1\uff0c\u517c\u5bb9\u89c4\u5212\u4e3a\u6240\u6709\u9ad8\u7248\u672c\u5fc5\u987b\u517c\u5bb9\u4f4e\u7248\u672c\uff0c\u90e8\u7f72\u4e86\u4ee5\u4e0b\u7248\u672c\u5b9e\u4f8b\uff1a</p> <ul> <li> <p>1.0.0\uff0c\u63d0\u4f9b\u4e86operation1</p> </li> <li> <p>1.1.0\uff0c\u63d0\u4f9b\u4e86operation1\u3001operation2</p> </li> </ul> <p>Edge Service\u5728\u8f6c\u53d1operation1\u65f6\uff0c\u4f1a\u81ea\u52a8\u4f7f\u75281.0.0+\u7684\u89c4\u5219\u6765\u8fc7\u6ee4\u5b9e\u4f8b</p> <p>Edge Service\u5728\u8f6c\u53d1operation2\u65f6\uff0c\u4f1a\u81ea\u52a8\u4f7f\u75281.1.0+\u7684\u89c4\u5219\u6765\u8fc7\u6ee4\u5b9e\u4f8b</p> <p>\u4ee5\u4e0a\u8fc7\u7a0b\u7528\u6237\u4e0d\u5fc5\u505a\u4efb\u4f55\u5e72\u9884\uff0c\u5168\u81ea\u52a8\u5b8c\u6210\uff0c\u4ee5\u907f\u514d\u5c06\u65b0\u7248\u672c\u7684operation\u8f6c\u53d1\u5230\u65e7\u7248\u672c\u7684\u5b9e\u4f8b\u4e2d\u53bb\u3002</p> <ul> <li>\u4f7f\u7528 URLMappedEdgeDispatcher</li> </ul> <p>URLMappedEdgeDispatcher \u5141\u8bb8\u7528\u6237\u914d\u7f6eURL\u548c\u5fae\u670d\u52a1\u7684\u6620\u5c04\u5173\u7cfb\u3002\u4f7f\u7528\u5b83\u53ef\u4ee5\u975e\u5e38\u7075\u6d3b\u7684\u5b9a\u4e49\u54ea\u4e9bURL\u8f6c\u53d1\u5230\u54ea\u4e9b\u5fae\u670d\u52a1\u3002\u5b83\u5305\u542b\u5982\u4e0b\u51e0\u4e2a\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n http:\n dispatcher:\n edge:\n url:\n enabled: true\n ## \u9ed8\u8ba4\u503c\uff0c\u4e00\u822c\u4e0d\u9700\u8981\u914d\u7f6e\n pattern: \"/(.*)\"\n mappings:\n businessV1:\n prefixSegmentCount: 1\n path: \"/url/business/v1/.*\"\n microserviceName: business\n versionRule: 1.0.0-2.0.0\n businessV2:\n prefixSegmentCount: 1\n path: \"/url/business/v2/.*\"\n microserviceName: business\n versionRule: 2.0.0-3.0.0\n</code></pre> <p><code>businessV1</code> \u914d\u7f6e\u9879\u8868\u793a\u7684\u542b\u4e49\u662f\u5c06\u8bf7\u6c42\u8def\u5f84\u4e3a <code>/url/business/v1/.*</code> \u7684\u8bf7\u6c42\uff0c\u8f6c\u53d1\u5230<code>business</code> \u8fd9\u4e2a\u5fae\u670d\u52a1\uff0c\u5e76\u4e14\u53ea\u8f6c\u53d1\u5230\u7248\u672c\u53f7\u4e3a1.0.0-2.0.0\u7684\u5b9e\u4f8b\uff08\u4e0d\u542b2.0.0\uff09\u3002\u8f6c\u53d1\u7684\u65f6\u5019URL\u4e3a <code>/business/v1/.*</code> \u3002path\u4f7f\u7528\u7684\u662fJDK\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u53ef\u4ee5\u67e5\u770bPattern\u7c7b\u7684\u8bf4\u660e\u3002prefixSegmentCount\u8868\u793a\u524d\u7f00\u7684URL Segment\u6570\u91cf\uff0c\u524d\u7f00\u4e0d\u5305\u542b\u5728\u8f6c\u53d1\u7684URL\u8def\u5f84\u4e2d\u3002\u6709\u4e09\u79cd\u5f62\u5f0f\u7684versionRule\u53ef\u4ee5\u6307\u5b9a\u30022.0.0-3.0.0\u8868\u793a\u7248\u672c\u8303\u56f4\uff0c\u542b2.0.0\uff0c\u4f46\u4e0d\u542b3.0.0\uff1b2.0.0+\u8868\u793a\u5927\u4e8e2.0.0\u7684\u7248\u672c\uff0c\u542b2.0.0\uff1b2.0.0\u8868\u793a\u53ea\u8f6c\u53d1\u52302.0.0\u7248\u672c\u30022\uff0c2.0\u7b49\u4ef7\u4e8e2.0.0\u3002</p> <p>\u4ece\u4e0a\u9762\u7684\u914d\u7f6e\u53ef\u4ee5\u770b\u51fa\uff0cURLMappedEdgeDispatcher\u4e5f\u652f\u6301\u5ba2\u6237\u7aef\u7070\u5ea6\u3002\u5f53\u7136\u914d\u7f6e\u9879\u4f1a\u6bd4DefaultEdgeDispatcher\u591a\u3002URLMappedEdgeDispatcher\u652f\u6301\u901a\u8fc7\u914d\u7f6e\u4e2d\u5fc3\u52a8\u6001\u7684\u4fee\u6539\u914d\u7f6e\uff0c\u8c03\u6574\u8def\u7531\u89c4\u5219\u3002</p> <ul> <li>\u4f7f\u7528 CommonHttpEdgeDispatcher</li> </ul> <p>CommonHttpEdgeDispatcher \u80fd\u591f\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230\u76d1\u542c HTTP \u6216\u8005 HTTP 2 \u534f\u8bae\u7684 Provider\uff0c \u5bf9\u4e8e Provider \u7684\u5f00\u53d1\u6846\u67b6\u6ca1\u6709\u9650\u5236\uff0c\u4e5f\u4e0d \u8981\u6c42 Provider \u6ce8\u518c\u5951\u7ea6\u4fe1\u606f\u3002 </p> <pre><code>servicecomb:\n http:\n dispatcher:\n edge:\n http:\n enabled: true\n ## \u9ed8\u8ba4\u503c\uff0c\u4e00\u822c\u4e0d\u9700\u8981\u914d\u7f6e\n pattern: \"/(.*)\" \n mappings:\n businessV2:\n prefixSegmentCount: 1\n path: \"/http/business/v2/.*\"\n microserviceName: business\n versionRule: 2.0.0\n</code></pre> <p>CommonHttpEdgeDispatcher \u914d\u7f6e\u9879\u7684\u542b\u4e49\u548c URLMappedEdgeDispatcher \u7c7b\u4f3c\u3002</p> <ul> <li>\u81ea\u5b9a\u4e49 Dispatcher</li> </ul> <p>\u81ea\u5b9a\u4e49Dispatcher\u5305\u542b\u4e24\u4e2a\u6b65\u9aa4\uff1a</p> <ol> <li>\u5b9e\u73b0AbstractEdgeDispatcher</li> <li>\u901a\u8fc7SPI\u53d1\u5e03\uff1a\u589e\u52a0\u6587\u4ef6META-INF/services/org.apache.servicecomb.transport.rest.vertx.VertxHttpDispatcher\uff0c\u5e76\u5199\u5165\u5b9e\u73b0\u7c7b</li> </ol> <p>\u8be6\u7ec6\u7684\u4ee3\u7801\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\u4e0b\u9762\u7684\u7ae0\u8282\"DEMO\u529f\u80fd\u8bf4\u660e\"\u3002\u5f00\u53d1\u8005\u4e5f\u53ef\u4ee5\u53c2\u8003DefaultEdgeDispatcher\u7b49\u4ee3\u7801\u6765\u5b9a\u4e49\u81ea\u5df1\u7684Dispatcher\u3002</p> <ul> <li>\u8fdb\u884c\u8ba4\u8bc1\u9274\u6743\u548c\u5176\u4ed6\u4e1a\u52a1\u5904\u7406</li> </ul> <p>\u901a\u8fc7Edge Servie\u5de5\u4f5c\u6d41\u7a0b\u53ef\u4ee5\u770b\u51fa\uff0c\u53ef\u4ee5\u901a\u8fc7\u591a\u79cd\u65b9\u5f0f\u6765\u6269\u5c55Edge Service\u7684\u529f\u80fd\uff0c\u5305\u62ecDispatcher\u3001HttpServerFilter\u3001Handler\u3001HttpClientFilter\u7b49\u3002\u6bd4\u8f83\u5e38\u7528\u548c\u7b80\u5355\u7684\u662f\u901a\u8fc7Handler\u6765\u6269\u5c55\u3002DEMO\u91cc\u9762\u5c55\u793a\u4e86\u5982\u4f55\u901a\u8fc7Handler\u6269\u5c55\u6765\u5b9e\u73b0\u9274\u6743\u3002\u8be6\u7ec6\u7684\u4ee3\u7801\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\u4e0b\u9762\u7684\u7ae0\u8282\"DEMO\u529f\u80fd\u8bf4\u660e\"\u3002</p>"},{"location":"edge/by-servicecomb-sdk.html#_3","title":"\u90e8\u7f72\u793a\u4f8b","text":""},{"location":"edge/by-servicecomb-sdk.html#_4","title":"\u5de5\u4f5c\u6a21\u5f0f","text":"<ul> <li>reactive (\u9ed8\u8ba4)</li> </ul> <p>Edge Service\u9ed8\u8ba4\u5de5\u4f5c\u4e8e\u9ad8\u6027\u80fd\u7684reactive\u6a21\u5f0f\uff0c\u6b64\u6a21\u5f0f\u8981\u6c42\u5de5\u4f5c\u4e8eEdge Service\u8f6c\u53d1\u6d41\u7a0b\u4e2d\u7684\u4e1a\u52a1\u4ee3\u7801\u4e0d\u80fd\u6709\u4efb\u4f55\u7684\u963b\u585e\u64cd\u4f5c\uff0c\u5305\u62ec\u4e0d\u9650\u4e8e\uff1a</p> <ul> <li> <p>\u8fdc\u7a0b\u540c\u6b65\u8c03\u7528\uff0c\u6bd4\u5982\u540c\u6b65\u67e5\u8be2\u6570\u636e\u5e93\u3001\u540c\u6b65\u8c03\u7528\u5fae\u670d\u52a1\uff0c\u6216\u662f\u540c\u6b65\u67e5\u8be2\u8fdc\u7a0b\u7f13\u5b58\u7b49\u7b49</p> </li> <li> <p>\u4efb\u4f55\u7684sleep\u8c03\u7528</p> </li> <li> <p>\u4efb\u4f55\u7684wait\u8c03\u7528</p> </li> <li> <p>\u8d85\u5927\u7684\u5faa\u73af</p> </li> </ul> <p>Edge Service\u7684\u5e95\u5c42\u662f\u57fa\u4e8enetty\u7684vertx\uff0c\u4ee5\u4e0a\u7ea6\u675f\u5373\u662fnetty\u7684reactive\u6a21\u5f0f\u7ea6\u675f\u3002</p> <p></p> <ul> <li>\u7ebf\u7a0b\u6c60</li> </ul> <p>\u5982\u679c\u4e1a\u52a1\u6a21\u578b\u65e0\u6cd5\u6ee1\u8db3reactive\u8981\u6c42\uff0c\u5219\u9700\u8981\u4f7f\u7528\u7ebf\u7a0b\u6c60\u6a21\u5f0f\u3002</p> <p>\u6b64\u65f6\u9700\u8981\u5728Edge Service\u7684microservice.yaml\u4e2d\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n executors:\n default: servicecomb.executor.groupThreadPool\n</code></pre> <p>\u8fd9\u91cc\u7684servicecomb.executor.groupThreadPool\u662fServiceComb\u5185\u7f6e\u7684\u9ed8\u8ba4\u7ebf\u7a0b\u6c60\u5bf9\u5e94\u7684spring bean\u7684beanId\uff1b\u4e1a\u52a1\u53ef\u4ee5\u5b9a\u5236\u81ea\u5df1\u7684\u7ebf\u7a0b\u6c60\uff0c\u5e76\u58f0\u660e\u4e3a\u4e00\u4e2abean\uff0c\u5176beanId\u4e5f\u53ef\u4ee5\u914d\u7f6e\u5230\u8fd9\u91cc\u3002</p> <p></p>"},{"location":"edge/by-servicecomb-sdk.html#demo","title":"DEMO\u529f\u80fd\u8bf4\u660e","text":"<p>DEMO \u6e90\u7801\u8bf7\u53c2\u8003 edge service demo</p> <ul> <li>\u6ce8\u518cDispatcher</li> </ul> <p>\u5b9e\u73b0\u63a5\u53e3org.apache.servicecomb.transport.rest.vertx.VertxHttpDispatcher\uff0c\u6216\u4ece org.apache.servicecomb.edge.core.AbstractEdgeDispatcher\u7ee7\u627f\uff0c\u5b9e\u73b0\u81ea\u5df1\u7684dispatcher\u529f\u80fd\u3002</p> <p>\u5b9e\u73b0\u7c7b\u901a\u8fc7java\u6807\u51c6\u7684SPI\u673a\u5236\u6ce8\u518c\u5230\u7cfb\u7edf\u4e2d\u53bb\u3002</p> <p>Dispatcher\u9700\u8981\u5b9e\u73b02\u4e2a\u65b9\u6cd5\uff1a</p> <ul> <li>getOrder</li> </ul> <p>Dispatcher\u9700\u8981\u5411vertx\u6ce8\u5165\u8def\u7531\u89c4\u5219\uff0c\u8def\u7531\u89c4\u5219\u4e4b\u95f4\u662f\u6709\u4f18\u5148\u7ea7\u987a\u5e8f\u5173\u7cfb\u7684\u3002</p> <p>\u7cfb\u7edf\u4e2d\u6240\u6709\u7684Dispatcher\u6309\u7167getOrder\u7684\u8fd4\u56de\u503c\u6309\u4ece\u5c0f\u5230\u5927\u7684\u65b9\u5f0f\u6392\u5e8f\uff0c\u6309\u987a\u5e8f\u521d\u59cb\u5316\u3002</p> <p>\u5982\u679c2\u4e2aDispatcher\u7684getOrder\u8fd4\u56de\u503c\u76f8\u540c\uff0c\u52192\u8005\u7684\u987a\u5e8f\u4e0d\u53ef\u9884\u77e5\u3002</p> <ul> <li>init</li> </ul> <p>init\u65b9\u6cd5\u5165\u53c2\u4e3avertx\u6846\u67b6\u4e2d\u7684io.vertx.ext.web.Router\uff0c\u9700\u8981\u901a\u8fc7\u8be5\u5bf9\u8c61\u5b9e\u73b0\u8def\u7531\u89c4\u5219\u7684\u5b9a\u5236\u3002</p> <p>\u53ef\u4ee5\u6307\u5b9a\u6ee1\u8db3\u8981\u6c42\u7684url\uff0c\u662f\u5426\u9700\u8981\u5904\u7406cookie\u3001\u662f\u5426\u9700\u8981\u5904\u7406body\u3001\u4f7f\u7528\u54ea\u4e2a\u81ea\u5b9a\u4e49\u65b9\u6cd5\u5904\u7406\u6536\u5230\u7684\u8bf7\u6c42\u7b49\u7b49</p> <p>\u66f4\u591a\u8def\u7531\u89c4\u5219\u7ec6\u8282\u8bf7\u53c2\u8003vertx\u5b98\u65b9\u6587\u6863\uff1avertx\u8def\u7531\u673a\u5236</p> <p>\u63d0\u793a\uff1a</p> <p>\u591a\u4e2aDispatcher\u53ef\u4ee5\u8bbe\u7f6e\u8def\u7531\u89c4\u5219\uff0c\u8986\u76d6\u5230\u76f8\u540c\u7684url\u3002</p> <p>\u5047\u8bbeDispatcher A\u548cB\u90fd\u53ef\u4ee5\u5904\u7406\u540c\u4e00\u4e2aurl\uff0c\u5e76\u4e14A\u4f18\u5148\u7ea7\u66f4\u9ad8\uff0c\u5219\uff1a</p> <ul> <li> <p>\u5982\u679cA\u5904\u7406\u5b8c\uff0c\u65e2\u6ca1\u5e94\u7b54\uff0c\u4e5f\u6ca1\u6709\u8c03\u7528RoutingContext.next()\uff0c\u5219\u5c5e\u4e8ebug\uff0c\u672c\u6b21\u8bf7\u6c42\u6302\u6b7b\u4e86</p> </li> <li> <p>\u5982\u679cA\u5904\u7406\u5b8c\uff0c\u7136\u540e\u8c03\u7528\u4e86RoutingContext.next()\uff0c\u5219\u4f1a\u5c06\u8bf7\u6c42\u8f6c\u79fb\u7ed9B\u5904\u7406</p> </li> <li> <p>\u8f6c\u53d1\u8bf7\u6c42</p> </li> </ul> <p>\u6ce8\u518c\u8def\u7531\u65f6\uff0c\u6307\u5b9a\u4e86\u4f7f\u7528\u54ea\u4e2a\u65b9\u6cd5\u6765\u5904\u7406\u8bf7\u6c42\uff08\u4e0b\u9762\u4f7f\u7528onRequest\u6765\u6307\u4ee3\u8be5\u65b9\u6cd5\uff09\uff0c\u5728onRequest\u4e2d\u5b9e\u73b0\u8f6c\u53d1\u903b\u8f91\u3002</p> <p>\u65b9\u6cd5\u539f\u578b\u4e3a\uff1a</p> <pre><code>void onRequest(RoutingContext context)\n</code></pre> <p>\u7cfb\u7edf\u5c01\u88c5\u4e86org.apache.servicecomb.edge.core.EdgeInvocation\u6765\u5b9e\u73b0\u8f6c\u53d1\u529f\u80fd\uff0c\u81f3\u5c11\u9700\u8981\u51c6\u5907\u4ee5\u4e0b\u53c2\u6570\uff1a</p> <ul> <li> <p>microserviceName\uff0c\u4e1a\u52a1\u81ea\u884c\u5236\u5b9a\u89c4\u5219\uff0c\u53ef\u4ee5\u5728url\u4f20\u5165\uff0c\u6216\u662f\u6839\u636eurl\u67e5\u627e\u7b49\u7b49</p> </li> <li> <p>context\uff0c\u5373onRequest\u7684\u5165\u53c2</p> </li> <li> <p>path\uff0c\u8f6c\u53d1\u76ee\u6807\u7684url</p> </li> <li> <p>httpServerFilters\uff0cDispatcher\u7236\u7c7b\u5df2\u7ecf\u521d\u59cb\u5316\u597d\u7684\u6210\u5458\u53d8\u91cf</p> </li> </ul> <pre><code> EdgeInvocation edgeInvocation = new EdgeInvocation();\n edgeInvocation.init(microserviceName, context, path, httpServerFilters);\n edgeInvocation.edgeInvoke();\n</code></pre> <p>edgeInvoke\u8c03\u7528\u5185\u90e8\uff0c\u4f1a\u4f5c\u4e3aServiceComb\u6807\u51c6consumer\u53bb\u8f6c\u53d1\u8c03\u7528\u3002</p> <p>\u4f5c\u4e3a\u6807\u51c6consumer\uff0c\u610f\u5473\u7740ServiceComb\u6240\u6709\u6807\u51c6\u7684\u6cbb\u7406\u80fd\u529b\u5728\u8fd9\u91cc\u90fd\u662f\u751f\u6548\u7684\u3002</p> <ul> <li>\u8bbe\u7f6e\u517c\u5bb9\u89c4\u5219</li> </ul> <p>\u4e0d\u540c\u7684\u4e1a\u52a1\u53ef\u80fd\u6709\u4e0d\u540c\u7684\u517c\u5bb9\u89c4\u5212\uff0cservicecomb\u9ed8\u8ba4\u7684\u517c\u5bb9\u89c4\u5219\uff0c\u8981\u6c42\u6240\u6709\u65b0\u7248\u672c\u517c\u5bb9\u65e7\u7248\u672c\u3002\u5982\u679c\u6ee1\u8db3\u8fd9\u4e2a\u8981\u6c42\uff0c\u5219\u4e0d\u5fc5\u505a\u4efb\u4f55\u7279\u6b8a\u7684\u8bbe\u7f6e\u3002</p> <p>\u8fd8\u6709\u4e00\u79cd\u5178\u578b\u7684\u89c4\u5212\uff1a</p> <ul> <li> <p>1.0.0-2.0.0\u5185\u90e8\u517c\u5bb9\uff0curl\u4e3a/microserviceName/v1/\u2026.\u7684\u5f62\u5f0f</p> </li> <li> <p>2.0.0-3.0.0\u5185\u90e8\u517c\u5bb9\uff0curl\u4e3a/microserviceName/v2/\u2026.\u7684\u5f62\u5f0f</p> </li> </ul> <p>\u2026\u2026</p> <p>\u5404\u5927\u7248\u672c\u4e4b\u95f4\u4e0d\u517c\u5bb9</p> <p>\u6b64\u65f6\uff0c\u5f00\u53d1\u4eba\u5458\u9700\u8981\u9488\u5bf9EdgeInvocation\u8bbe\u7f6e\u517c\u5bb9\u89c4\u5219\uff1a</p> <pre><code>private CompatiblePathVersionMapper versionMapper = new CompatiblePathVersionMapper();\n\n\u2026\u2026\n\nedgeInvocation.setVersionRule(versionMapper.getOrCreate(pathVersion).getVersionRule());\n</code></pre> <p>versionMapper\u7684\u4f5c\u7528\u662f\u5c06v1\u6216\u662fv2\u8fd9\u6837\u7684\u4e32\uff0c\u8f6c\u4e3a1.0.0-2.0.0\u62162.0.0-3.0.0\u8fd9\u6837\u7684\u517c\u5bb9\u89c4\u5219\u3002</p> <ul> <li>\u9274\u6743</li> </ul> <p>Edge Service\u662f\u7cfb\u7edf\u7684\u8fb9\u754c\uff0c\u5bf9\u4e8e\u5f88\u591a\u8bf7\u6c42\u9700\u8981\u6267\u884c\u9274\u6743\u903b\u8f91\u3002</p> <p>\u57fa\u4e8e\u6807\u51c6\u7684ServiceComb\u673a\u5236\uff0c\u53ef\u4ee5\u901a\u8fc7handler\u6765\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd\u3002</p> <p>\u6700\u7b80\u5355\u7684\u793a\u610f\u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>public class AuthHandler implements Handler {\n private static Logger LOGGER = LoggerFactory.getLogger(AuthHandler.class);\n\n private static Auth auth;\n\n static {\n auth = Invoker.createProxy(\"auth\", \"auth\", Auth.class);\n }\n\n @Override\n public void init(MicroserviceMeta microserviceMeta, InvocationType invocationType) {\n }\n\n @Override\n public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {\n if (invocation.getHandlerContext().get(EdgeConst.ENCRYPT_CONTEXT) != null) {\n invocation.next(asyncResp);\n return;\n }\n\n auth.auth(\"\").whenComplete((succ, e) -&gt; doHandle(invocation, asyncResp, succ, e));\n }\n</code></pre> <p>Auth\u8868\u793a\u662f\u9274\u6743\u5fae\u670d\u52a1\u63d0\u4f9b\u7684\u63a5\u53e3\uff0cInvoker.createProxy(\"auth\", \"auth\", Auth.class)\u662f\u900f\u660eRPC\u5f00\u53d1\u6a21\u5f0f\u4e2dconsumer\u7684\u5e95\u5c42api\uff0c\u4e0e@ReferenceRpc\u662f\u7b49\u6548\uff0c\u53ea\u4e0d\u8fc7\u4e0d\u9700\u8981\u4f9d\u8d56spring bean\u673a\u5236\u3002</p> <p>Auth\u63a5\u53e3\u5b8c\u5168\u7531\u4e1a\u52a1\u5b9a\u4e49\uff0c\u8fd9\u91cc\u53ea\u662f\u4e00\u4e2a\u793a\u4f8b\u3002</p> <p>Handler\u5f00\u53d1\u5b8c\u6210\u540e\uff0c\u914d\u7f6e\u5230edge service\u7684microservice.yaml\u4e2d\uff1a</p> <pre><code>servicecomb:\n handler:\n chain:\n Consumer:\n default: auth,\u2026\u2026\n service:\n auth: \u2026\u2026\n</code></pre> <p>\u8fd9\u4e2a\u4f8b\u5b50\uff0c\u8868\u793a\u8f6c\u53d1\u8bf7\u6c42\u7ed9\u6240\u6709\u7684\u5fae\u670d\u52a1\u90fd\u5fc5\u987b\u7ecf\u8fc7\u9274\u6743\uff0c\u4f46\u662f\u8c03\u7528\u9274\u6743\u5fae\u670d\u52a1\u65f6\u4e0d\u9700\u8981\u9274\u6743\u3002</p> <p>\u7279\u522b\u6ce8\u610f\uff1a edge service \u7684\u5b9a\u5236\u903b\u8f91\uff0c\u5305\u62ec Dispatcher, Handler, HttpServerFilter \u7b49\uff0c\u5747\u5728 \u4e8b\u4ef6\u6d3e\u53d1\u7ebf\u7a0b event-loop \u4e2d\u6267\u884c\uff0c \u4efb\u4f55\u5b9a\u5236\u903b\u8f91\u5fc5\u987b\u4e0d\u80fd\u591f\u5b58\u5728\u963b\u585e\u903b\u8f91\uff0c\u5426\u5219\u4f1a\u5bfc\u81f4 edge service \u51fa\u73b0\u6b7b\u9501\u3002 \u6bd4\u5982\u4e0a\u9762\u9274\u6743\u7684\u903b\u8f91\uff0c\u5fc5\u987b\u4f7f\u7528\u5f02\u6b65\u63a5\u53e3\uff0c\u800c\u4e0d\u80fd\u591f\u53c2\u8003 provider \u5f00\u53d1\u7684\u903b\u8f91\u90a3\u6837\uff0c\u4f7f\u7528\u540c\u6b65\u63a5\u53e3\u3002 \u5efa\u8bae\u4e1a\u52a1\u4f7f\u7528 \u5b9a\u5236\u903b\u8f91\u7684\u65f6\u5019\uff0c\u5bf9 edge service \u8fdb\u884c\u5e76\u53d1\u6d4b\u8bd5\uff0c\u6b7b\u9501\u95ee\u9898\u4f1a\u5728\u5e76\u53d1\u6570\u5927\u4e8e event-loop \u7ebf\u7a0b\u6570\u91cf\u7684\u60c5\u51b5\u4e0b\u51fa\u73b0\u3002 \uff08event-loop\u7ebf\u7a0b\u6570\u91cf\u9ed8\u8ba4\u662fCPU\u6838\u6570\u7684\u4e24\u500d\uff0c \u53ef\u4ee5\u901a\u8fc7 jstack \u547d\u4ee4\u67e5\u770b\u7ebf\u7a0b\u3002\uff09</p>"},{"location":"edge/nginx.html","title":"nginx \u7f51\u5173\u7b80\u5355\u4ecb\u7ecd","text":""},{"location":"edge/nginx.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":""},{"location":"edge/nginx.html#confd","title":"confd","text":"<p>confd\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u914d\u7f6e\u7ba1\u7406\u5de5\u5177\uff0c\u6e90\u7801\u5730\u5740\uff1ahttps://github.com/kelseyhightower/confd\uff0c \u5b83\u53ef\u4ee5\u5c06\u914d\u7f6e\u4fe1\u606f\u5b58\u50a8\u5728etcd\u3001consul\u3001dynamodb\u3001redis\u4ee5\u53cazookeeper\u7b49\u3002confd\u5b9a\u671f\u4f1a\u4ece\u8fd9\u4e9b\u5b58\u50a8\u8282\u70b9pull\u6700 \u65b0\u7684\u914d\u7f6e\uff0c\u7136\u540e\u91cd\u65b0\u52a0\u8f7d\u670d\u52a1\uff0c\u5b8c\u6210\u914d\u7f6e\u6587\u4ef6\u7684\u66f4\u65b0\u3002</p>"},{"location":"edge/nginx.html#nginx_1","title":"Nginx","text":"<p>Nginx (engine x)\u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684HTTP\u548c\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u5177\u6709\u8d1f\u8f7d\u5747\u8861\u7684\u529f\u80fd\u3002\u8be6\u60c5\u8bf7 \u53c2\u8003http://www.nginx.cn/doc/\u3002</p>"},{"location":"edge/nginx.html#_2","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u672c\u5c0f\u8282\u7b80\u5355\u4ecb\u7ecd Nginx \u5bf9\u63a5\u670d\u52a1\u4e2d\u5fc3\uff0c\u4ece\u670d\u52a1\u4e2d\u5fc3\u4e2d\u83b7\u53d6\u670d\u52a1\u4fe1\u606f\u5e76\u901a\u8fc7 confd \u52a8\u6001\u66f4\u65b0 Nginx \u7684\u914d\u7f6e\u3002</p> <p>\u4f7f\u7528 nginx+confd \u52a8\u6001\u53cd\u5411\u4ee3\u7406\u7684\u5b9e\u73b0\u6b65\u9aa4\u53ef\u53c2\u8003\u6587 \u7ae0http://www.cnblogs.com/Anker/p/6112022.html\u3002</p> <ul> <li>\u65b9\u6cd5\u4e00\uff1ahttp\u8c03\u7528</li> </ul> <p>\u670d\u52a1\u4e2d\u5fc3\u5f00\u653ehttp\u63a5\u53e3\u5747\u9700\u8981\u6dfb\u52a0\u79df\u6237\u5934\u90e8\u4fe1\u606f\uff1a\u201cX-Tenant-Name:tenantName\u201d\uff0ctenameName\u4e3a\u79df\u6237\u540d\uff0c\u9ed8 \u8ba4\u4e3adefault\uff0c\u4f8b\u5982\"X-Tenant-Name:default\"\u3002</p> <ul> <li> <p>\u68c0\u67e5\u670d\u52a1\u4e2d\u5fc3\u5065\u5eb7\u72b6\u6001</p> <pre><code> ```\n GET 127.0.0.1:30100/health\n ```\n</code></pre> </li> <li> <p>\u83b7\u53d6\u6240\u6709\u5fae\u670d\u52a1\u4fe1\u606f</p> <pre><code> ```\n GET 127.0.0.1:30100/registry/v3/microservices\n ```\n</code></pre> </li> <li> <p>\u83b7\u53d6\u6307\u5b9aid\u7684\u5fae\u670d\u52a1\u4fe1\u606f</p> <p>\u9996\u5148\u6839\u636e\u5fae\u670d\u52a1\u4fe1\u606f\u83b7\u53d6serviceId</p> <pre><code> GET 127.0.0.1:30100/registry/v3/existence?type=microservice&amp;appId={appId}&amp;serviceName={serviceName}&amp;version={version}\n</code></pre> <p>\u6839\u636e\u4e0a\u8ff0\u63a5\u53e3\u8fd4\u56de\u7684serviceId\u83b7\u53d6\u5fae\u670d\u52a1\u5b8c\u6574\u4fe1\u606f</p> <pre><code> GET 127.0.0.1:30100/registry/v3/microservices/{serviceId}\n</code></pre> </li> <li> <p>\u83b7\u53d6\u6307\u5b9a\u5fae\u670d\u52a1\u7684\u6240\u6709\u5b9e\u4f8b\u4fe1\u606f</p> <pre><code> GET 127.0.0.1:30100/registry/v3/microservices/{serviceId}/instances\n</code></pre> <p>\u9700\u8981\u5728header\u4e2d\u6dfb\u52a0\uff1a\"X-ConsumerId:{serviceId}\"\u3002</p> </li> <li> <p>\u67e5\u627e\u5fae\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f</p> <pre><code> GET 127.0.0.1:30100/registry/v3/instances?appId={appId}&amp;serviceName={serviceName}&amp;version={version}\n</code></pre> <p>\u9700\u8981\u5728header\u4e2d\u6dfb\u52a0: \"X-ConsumerId:{serviceId}\"\u3002</p> </li> <li> <p>\u65b9\u6cd5\u4e8c\uff1a\u4f7f\u7528servicecomb\u5f00\u6e90\u4ee3\u7801\u63a5\u53e3</p> </li> </ul> <p>\u5728\u5f00\u53d1\u5fae\u670d\u52a1\u5e94\u7528\uff0c\u53ea\u9700\u8981\u8c03\u7528servicecomb\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5de5\u5177\u7c7bRegistryUtil.java\u4e2d\u63d0\u4f9b\u7684\u63a5\u53e3\uff0c\u5373\u53ef \u83b7\u53d6\u670d\u52a1\u4e2d\u5fc3\u7684\u4fe1\u606f\uff0c\u63a5\u53e3\u63cf\u8ff0\u5982\u4e0b\uff1a</p> <ul> <li> <p>\u83b7\u53d6\u6240\u6709\u5fae\u670d\u52a1\u4fe1\u606f </p> <pre><code> List&lt;Microservice&gt; getAllMicroservices();\n</code></pre> </li> <li> <p>\u83b7\u53d6\u5fae\u670d\u52a1\u552f\u4e00\u6807\u8bc6 </p> <pre><code> String getMicroserviceId(String appId, String microserviceName, String versionRule);\n</code></pre> </li> <li> <p>\u6839\u636e\u5fae\u670d\u52a1\u552f\u4e00\u6807\u8bc6\u67e5\u8be2\u5fae\u670d\u52a1\u9759\u6001\u4fe1\u606f </p> <pre><code> Microservice getMicroservice(String microserviceId);\n</code></pre> </li> <li> <p>\u6839\u636e\u591a\u4e2a\u5fae\u670d\u52a1\u552f\u4e00\u6807\u8bc6\u67e5\u8be2\u6240\u6709\u5fae\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f </p> <pre><code> List&lt;MicroserviceInstance&gt; getMicroserviceInstance(String consumerId, String providerId);\n</code></pre> </li> <li> <p>\u6309\u7167app+interface+version\u67e5\u8be2\u5b9e\u4f8bendpoints\u4fe1\u606f </p> <pre><code> List&lt;MicroserviceInstance&gt; findServiceInstance(String consumerId, String appId, String serviceName,String versionRule);\n</code></pre> </li> </ul> <p>\u901a\u8fc7\u4e0a\u8ff0http\u63a5\u53e3\u53ef\u83b7\u53d6\u5230\u670d\u52a1\u4e2d\u5fc3\u7684\u5fae\u670d\u52a1\u548c\u5176\u5b9e\u4f8b\u7684\u4fe1\u606f\uff0c\u4ece\u800c\u901a\u8fc7confd\u52a8\u6001\u66f4\u65b0nginx\u914d\u7f6e\u3002</p>"},{"location":"edge/open-service.html","title":"\u670d\u52a1\u80fd\u529b\u5f00\u653e","text":"<p>\u5fae\u670d\u52a1\u80fd\u529b\u9700\u8981\u901a\u8fc7\u7f51\u5173\u5f00\u653e\u7ed9\u7528\u6237\u3001\u5176\u4ed6\u5916\u90e8\u7cfb\u7edf\u8bbf\u95ee\u3002\u7f51\u5173\u4e00\u65b9\u9762\u626e\u6f14\u7740\u6c47\u96c6\u7528\u6237\u8bf7\u6c42\u7684\u4f5c\u7528\uff0c\u540c\u65f6\u626e\u6f14\u8ba4\u8bc1\u3001\u9274\u6743\u3001\u6d41\u91cf \u63a7\u5236\u3001\u9632\u653b\u51fb\u7684\u7528\u9014\u3002\u7531\u4e8e\u7f51\u5173\u662f\u4e00\u4e2a\u6c47\u805a\u70b9\uff0c\u5bb9\u6613\u5f62\u6210\u4e1a\u52a1\u7684\u74f6\u9888\uff0c\u901a\u5e38\u8fd8\u4f1a\u91c7\u7528\u591a\u7ea7\u7f51\u5173\uff0c\u5916\u5c42\u7684\u7f51\u5173\u63d0\u4f9b\u4e3b\u5907\u4ee5\u53ca\u7b80\u5355 \u7684\u8bf7\u6c42\u8f6c\u53d1\u529f\u80fd\uff0c\u5185\u5c42\u7f51\u5173\u5b9e\u73b0\u9274\u6743\u7b49\u529f\u80fd\uff0c\u591a\u5b9e\u4f8b\u90e8\u7f72\u3002\u5e38\u89c1\u7684\u53ef\u4ee5\u7528\u4e8e\u5916\u5c42\u7f51\u5173\u7684\u6280\u672f\u548c\u670d\u52a1\u5305\u62ec <code>LVS</code>\u3001<code>DNS</code>, <code>Nginx</code> \u7b49\uff0c\u5185\u5c42\u7f51\u5173\u5305\u62ec <code>spring cloud gateway</code>\u3001<code>zuul</code> \u7b49\u3002</p> <p>ServiceComb \u4e5f\u63d0\u4f9b\u4e86\u5185\u5c42\u7f51\u5173\u670d\u52a1 <code>Edge Service</code>\u3002Edge Service \u5185\u5efa\u4e86\u5f3a\u5927\u7684\u8def\u7531\u7b56\u7565\uff0c\u652f\u6301\u63a5\u53e3\u7ea7\u522b\u7684 \u517c\u5bb9\u6027\u8f6c\u53d1\uff08\u7070\u5ea6\u53d1\u5e03\uff09\uff0c\u5185\u5d4c\u6cbb\u7406\u80fd\u529b\uff0c\u5e76\u652f\u6301\u975e\u5e38\u7075\u6d3b\u7684\u6269\u5c55\u673a\u5236\u3002</p>"},{"location":"edge/zuul.html","title":"\u4f7f\u7528 <code>zuul</code> \u548c <code>spring cloud gateway</code> \u505a\u7f51\u5173","text":"<p>Zuul\u662fNetflix\u7684\u57fa\u4e8eJVM\u7684\u8def\u7531\u5668\u548c\u670d\u52a1\u5668\u7aef\u8d1f\u8f7d\u5747\u8861\u5668\uff0c\u53ef\u4ee5\u4f7f\u7528Zuul\u8fdb\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a</p> <ul> <li>\u8ba4\u8bc1</li> <li>\u6d1e\u5bdf</li> <li>\u538b\u529b\u6d4b\u8bd5</li> <li>\u91d1\u4e1d\u96c0\u6d4b\u8bd5</li> <li>\u52a8\u6001\u8def\u7531</li> <li>\u670d\u52a1\u8fc1\u79fb</li> <li>\u8d1f\u8f7d\u8131\u843d</li> <li>\u5b89\u5168</li> <li>\u9759\u6001\u76f8\u54cd\u5e94\u5904\u7406</li> <li>\u4e3b\u52a8/\u88ab\u52a8\u6d41\u91cf\u7ba1\u7406</li> </ul> <p>\u5173\u4e8eZuul\u7684\u8be6\u7ec6\u529f\u80fd\u4ecb\u7ecd\u8bf7\u53c2\u8003\u8def\u7531\u5668\u548c\u8fc7\u6ee4\u5668\uff1aZuul\u3002</p> <p>spring cloud gateway \u662f spring cloud \u5f00\u53d1\u7684\u65b0\u4e00\u4ee3\u7f51\u5173\u670d\u52a1\uff0c\u8be6\u7ec6\u4ecb\u7ecd\u53ef\u4ee5\u53c2\u8003sprig cloud gateway</p> <p>\u4f7f\u7528 <code>zuul</code> \u548c <code>spring cloud gateway</code> \u4f5c\u4e3a\u7f51\u5173\uff0c\u6838\u5fc3\u9700\u8981\u89e3\u51b3\u7684\u95ee\u9898\u662f\u4ece\u670d\u52a1\u4e2d\u5fc3\u53d1\u73b0\u5176\u4ed6\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c \u9700\u8981\u4f7f\u7528\u5230 spring cloud huawei \u7684\u7ec4\u4ef6\uff0c \u8be6\u7ec6\u5f00\u53d1\u6307\u5357\u53ef\u4ee5\u53c2\u8003zuul\u7528spring cloud huawei\u7684\u4f8b\u5b50\uff0cgateway\u7528spring cloud huawei\u7684\u4f8b\u5b50</p>"},{"location":"featured-topics/application-bmi.html","title":"Java-Chassis \u5165\u95e8\u6307\u5357 - \u5f00\u53d1BMI\u5e94\u7528","text":"<p>\u672c\u6307\u5357\u5c06\u4ee5\u4e00\u4e2a\u7b80\u5355\u7684 \u4f53\u8d28\u6307\u6570(BMI) \u5e94\u7528\u5f00\u5c55\u5fae\u670d\u52a1\u4e4b\u65c5\u3002\u4f53\u8d28\u6307\u6570\u4e3b\u8981\u7528\u4e8e\u8861\u91cf\u4eba\u4f53\u80d6\u7626\u7a0b\u5ea6\u3002\u8be5\u5e94\u7528\u4e3b\u8981\u5305\u542b\u4e24\u4e2a\u5fae\u670d\u52a1\uff1a</p> <ul> <li> <p>\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\uff1a\u8d1f\u8d23\u5904\u7406\u8fd0\u7b97\u4e8b\u52a1\u3002</p> </li> <li> <p>\u4f53\u8d28\u6307\u6570\u754c\u9762\uff1a\u63d0\u4f9b\u7528\u6237\u754c\u9762\u53ca\u7f51\u5173\u670d\u52a1\u3002</p> </li> </ul> <p>\u5176\u8fd0\u884c\u6d41\u7a0b\u4e3a\uff1a </p> <p>\u5176\u4e2d\uff0c\u865a\u7ebf\u8868\u793a\u670d\u52a1\u6ce8\u518c\u53ca\u670d\u52a1\u53d1\u73b0\u7684\u8fc7\u7a0b\u3002</p> <p>\u672c\u6307\u5357\u5305\u542b\u5982\u4e0b\u5185\u5bb9\uff1a</p> <ul> <li>\u5feb\u901f\u5165\u95e8</li> <li>\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1</li> <li>\u5fae\u670d\u52a1\u5f00\u53d1\u8fdb\u9636</li> </ul> <p>\u4ecb\u7ecd\u6587\u6863\u7684\u6e90\u4ee3\u7801\u6258\u7ba1\u5728github</p>"},{"location":"featured-topics/application-porter.html","title":"Java-Chassis \u5165\u95e8\u6307\u5357 - \u5f00\u53d1 porter \u5e94\u7528","text":"<p>\u793a\u4f8b\u9879\u76ee\u5305\u542b\u5982\u4e0b\u7ae0\u8282\uff1a</p> <ul> <li>User Story</li> <li>\u8bbe\u8ba1\u5fae\u670d\u52a1</li> <li>\u5f00\u53d1\u754c\u9762(porter-website)</li> <li>\u5f00\u53d1\u6587\u4ef6\u4e0a\u4f20\u529f\u80fd(file-service)</li> <li>\u5f00\u53d1\u7f51\u5173(gateway-service)</li> <li>\u4f7f\u7528MyBatis\u8bbf\u95ee\u6570\u636e\u5e93(user-service)</li> <li>\u8fdb\u884c\u8ba4\u8bc1\u548c\u9274\u6743\u8bbe\u8ba1</li> <li>\u7f51\u5173HTTPS\u5b89\u5168\u914d\u7f6e</li> </ul> <p>\u793a\u4f8b\u9879\u76ee\u7684\u51fa\u53d1\u70b9\u662f\u5e2e\u52a9\u5f00\u53d1\u8005\u5f00\u53d1\u4e00\u4e2a\u5b8c\u6574\u7684\u5fae\u670d\u52a1\u5e94\u7528\u3002\u901a\u8fc7\u4e00\u4e2a\u5178\u578b\u7684\u5e94\u7528\u573a\u666f\uff0c\u5c55\u73b0\u4e00\u4e2a\u5fae\u670d\u52a1\u5e94\u7528\u9700\u8981\u89e3\u51b3\u90a3\u4e9b\u95ee\u9898\uff0c\u5728\u4e0d\u540c\u7684\u7ae0\u8282\u91cc\u9762\uff0c\u4f1a\u8be6\u7ec6\u89e3\u91ca\u89e3\u51b3\u89e3\u51b3\u8fd9\u4e9b\u95ee\u9898\u7684\u6280\u672f\u539f\u7406\u548c\u5b9e\u73b0\u8fc7\u7a0b\u3002</p> <p>\u8fd9\u4e2a\u5e94\u7528\u573a\u666f\uff0c\u662f\u901a\u8fc7\u6536\u96c6\u4e86\u4e00\u4e9b\u7528\u6237\u7684\u771f\u5b9e\u4e1a\u52a1\u573a\u666f\u63d0\u53d6\u51fa\u6765\u7684\u3002\u5177\u4f53\u5305\u62ec\uff1a</p> <ol> <li> <p>\u4e00\u4e2a\u63a8\u8350\u7684\u5fae\u670d\u52a1\u8bbe\u8ba1\u65b9\u6848\uff1b</p> </li> <li> <p>\u8ba4\u8bc1\u9274\u6743\uff1b</p> </li> <li> <p>\u4f7f\u7528mybatis\u8bbf\u95ee\u6570\u636e\u5e93\uff1b</p> </li> <li> <p>\u4f7f\u7528html+js\u63d0\u4f9b\u754c\u9762\u670d\u52a1\uff1b</p> </li> <li> <p>\u4e0a\u4f20\u6587\u4ef6\uff1b</p> </li> <li> <p>\u4f7f\u7528\u7f51\u5173\u548c\u914d\u7f6eHTTPS\uff1b</p> </li> </ol> <p>\u5728\u8fd9\u4e2a\u5e94\u7528\u4e2d\uff0c\u5c3d\u53ef\u80fd\u8ba9\u670d\u52a1\u5c0f\u3001\u6bcf\u4e2a\u5fae\u670d\u52a1\u5b8c\u5168\u72ec\u7acb\uff0c\u6ca1\u6709\u4ee3\u7801\u4e0a\u7684\u4f9d\u8d56\uff0c\u670d\u52a1\u4e4b\u95f4\u901a\u8fc7REST\u63a5\u53e3\u76f8\u4e92\u8bbf\u95ee\u3002\u4e3a\u4e86\u8fbe\u5230\u8fd9\u4e2a\u76ee\u7684\uff0c\u53ef\u80fd\u4f1a\u6709\u4e9b\u91cd\u590d\u4ee3\u7801\uff08\u5305\u62ec\u914d\u7f6e\u7c7b\u6587\u4ef6\u5982pom.xml\u3001\u6570\u636e\u6a21\u578b\u7c7b\u6587\u4ef6\u7b49\uff09\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u7ed3\u5408\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u662f\u5426\u63d0\u4f9b\u516c\u5171\u6a21\u5757\uff0c\u6765\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u3002\u5728\u8fd9\u4e2a\u9879\u76ee\u4e2d\u9009\u62e9\u7684\u662f\u7528\u91cd\u590d\u4ee3\u7801\u6765\u6362\u53d6\u81ea\u7531\u5ea6\u7684\u65b9\u6848\u3002</p> <p>\u5728\u5b9e\u9645\u7684\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u8fd8\u4f1a\u9075\u5faa\u5176\u4ed6\u4e00\u4e9b\u548c\u5fae\u670d\u52a1\u5f00\u53d1\u6709\u5173\u7684\u539f\u5219\uff0c\u5305\u62ec\u65e0\u72b6\u6001\u8bbe\u8ba1\u7b49\u3002\u8fd9\u91cc\u7684\u4f8b\u5b50\u7684\u76ee\u7684\u662f\u642d\u5efa\u4e00\u4e2a\u5546\u4e1a\u53ef\u7528\u7684\u5fae\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u4f1a\u5728\u67b6\u6784\u8bbe\u8ba1\u3001\u65b9\u6848\u8bbe\u8ba1\u4e0a\u4e5f\u7ed9\u51fa\u4e00\u5b9a\u7684\u5efa\u8bae\u4ee5\u53ca\u8bf4\u660e\u8fd9\u6837\u5904\u7406\u7684\u76ee\u7684\u3002</p> <p>\u672c\u4e13\u9898\u7684\u6d89\u53ca\u7684\u4ee3\u7801\u5747\u6258\u7ba1\u5728github\uff0c\u53c2\u8003 Porter\u5e94\u7528 \u3002\u5f00\u53d1\u8005\u53ef\u4ee5clone\u4e00\u4efd\u4f9b\u5b66\u4e60\u4f7f\u7528\uff0c\u6216\u8005\u4f5c\u4e3a\u6b63\u5f0f\u9879\u76ee\u7684\u6a21\u677f\u3002</p>"},{"location":"featured-topics/compatibility.html","title":"\u517c\u5bb9\u95ee\u9898\u548c\u517c\u5bb9\u6027\u7b56\u7565","text":"<p>\u517c\u5bb9\u662f\u88ab\u5e7f\u6cdb\u8ba8\u8bba\u7684\u95ee\u9898\uff0c\u5927\u91cf\u5f00\u53d1\u8005\u4e5f\u5173\u6ce8 ServiceComb \u7684\u517c\u5bb9\u6027\u5982\u4f55\u3002 \u5199\u8fd9\u7bc7\u6587\u7ae0\u7684\u89e6\u53d1\u70b9\u662f\u5728 ServiceComb \u4e2d \u56de\u7b54\u4e86\u4e00\u4e2a\u5173\u4e8e\u517c\u5bb9\u7684\u95ee\u9898 \u3002 \u5728 \u8fd9\u4e2a\u95ee\u9898\u4e2d\uff0c \u5f00\u53d1\u8005\u4e3a\u4e86\u9690\u85cf\u7cfb\u7edf\u5185\u90e8\u7684\u53d8\u5316\uff0c\u9700\u8981\u5728\u4ee3\u7801\u4e2d\u989d\u5916\u589e\u52a0\u7279\u6b8a\u903b\u8f91\uff0c\u4ee5\u4fdd\u969c\u4f7f\u7528\u8005\u4e0d\u611f\u77e5\u8fd9\u4e2a\u53d8\u5316\u3002 \u8fd9\u4e2a\u95ee\u9898 \u53cd\u6620\u4e86\u517c\u5bb9\u95ee\u9898\u7684\u4e24\u9762\u6027\uff1a\uff081\uff09\u4fdd\u6301\u517c\u5bb9\u53ef\u4ee5\u5c4f\u853d\u4f7f\u7528\u8005\u5bf9\u4e8e\u53d8\u5316\u7684\u611f\u77e5\uff0c\u7ef4\u6301\u73b0\u6709\u529f\u80fd\u7684\u7a33\u5b9a\u6027\uff0c\u964d\u4f4e\u5f15\u5165\u65b0\u7248\u672c\u7684\u6210\u672c\uff0c \u51cf\u5c11\u5bf9\u73b0\u6709\u7cfb\u7edf\u529f\u80fd\u7684\u5f71\u54cd\uff1b\uff082\uff09\u4fdd\u6301\u517c\u5bb9\u9700\u8981\u5728\u4ee3\u7801\u4e2d\u589e\u52a0\u590d\u6742\u6027\uff0c\u8fd9\u4e9b\u590d\u6742\u6027\u53ef\u80fd\u5e76\u4e0d\u662f\u5b9e\u73b0\u73b0\u5b9e\u4e1a\u52a1\u903b\u8f91\u5fc5\u987b\u7684\uff0c\u7ee7\u800c \u7ed9\u73b0\u6709\u7cfb\u7edf\u529f\u80fd\u7684\u53ef\u9760\u6027\u5e26\u6765\u95f4\u63a5\u5f71\u54cd\uff1b\u4ece\u5f00\u53d1\u8005\u7684\u89d2\u5ea6\uff0c\u505a\u4e0d\u517c\u5bb9\u6027\u91cd\u6784\u901a\u5e38\u662f\u4e0d\u5f97\u5df2\u800c\u4e3a\u4e4b\uff0c\u6216\u8005\u7531\u4e8e\u73b0\u6709\u63a5\u53e3\u8bbe\u8ba1\u4e0d \u5408\u7406\u5f71\u54cd\u6269\u5c55\uff0c\u6216\u8005\u5b58\u5728\u67d0\u4e9b\u672a\u8003\u8651\u7684\u7f3a\u9677\uff0c\u4e0d\u671f\u671b\u4f7f\u7528\u8005\u7ee7\u7eed\u4f7f\u7528\u3002\u5982\u679c\u4fdd\u6301\u517c\u5bb9\uff0c\u4f7f\u7528\u8005\u4e0d\u80fd\u611f\u77e5\u5230\u8fd9\u4e2a\u53d8\u5316\uff0c \u76f4\u5230\u8be5\u529f\u80fd\u5728\u5b9e\u9645\u73af\u5883\u51fa\u73b0\u95ee\u9898\uff0c\u589e\u52a0\u4e86\u95ee\u9898\u53d1\u73b0\u65f6\u95f4\u3002</p> <p>\u8f6f\u4ef6\u4e0d\u53ef\u80fd\u4e00\u5f00\u59cb\u5c31\u88ab\u8bbe\u8ba1\u7684\u5b8c\u7f8e\uff0c\u56e0\u6b64\u517c\u5bb9\u6027\u95ee\u9898\u4f1a\u4e00\u76f4\u5b58\u5728\u3002\u9700\u8981\u7ed3\u5408\u517c\u5bb9\u6027\u7684\u573a\u666f\u548c\u517c\u5bb9\u6027\u7684\u5f71\u54cd\uff0c\u7efc\u5408\u8bc4\u4f30\u517c\u5bb9\u7b56\u7565\uff0c \u4f7f\u5f97\u65e2\u4fdd\u6301\u5f15\u5165\u65b0\u7248\u672c\u7684\u6548\u7387\uff0c\u53c8\u80fd\u591f\u5728\u6bcf\u6b21\u5347\u7ea7\u65b0\u7248\u672c\u7684\u65f6\u5019\uff0c\u4fee\u590d\u5df2\u77e5\u95ee\u9898\uff0c\u8ba9\u7248\u672c\u5347\u7ea7\u53d8\u5f97\u66f4\u6709\u4ef7\u503c\u3002</p>"},{"location":"featured-topics/compatibility.html#_2","title":"\u517c\u5bb9\u6027\u573a\u666f\u548c\u5206\u7c7b","text":"<p>\u4e3a\u4e86\u8bc4\u4f30\u517c\u5bb9\u6027\u7684\u5f71\u54cd\uff0c\u9700\u8981\u7ec6\u5316\u517c\u5bb9\u6027\u7684\u573a\u666f\u548c\u5206\u7c7b\u3002</p> <ul> <li> <p>\u8fd0\u884c\u65f6\u517c\u5bb9\u3002\u8003\u8651\u4e00\u538b\u7f29\u6587\u4ef6\u7684\u7a0b\u5e8f <code>zip.exe</code>\uff0c \u8fd9\u4e2a\u7a0b\u5e8f\u5728\u8001\u7248\u672c\u7684 windows \u91cc\u9762\u53ef\u4ee5\u6b63\u5e38\u8fd0\u884c\uff0c\u7136\u540e\u5c06\u8fd9\u4e2a \u7a0b\u5e8f\u62f7\u8d1d\u5230\u65b0\u7248\u672c\u7684 windows \u91cc\u9762\uff0c\u5982\u679c\u4ecd\u7136\u53ef\u4ee5\u6267\u884c\uff0c\u90a3\u4e48\u8ba4\u4e3a\u662f\u8fd0\u884c\u65f6\u517c\u5bb9\uff1b\u518d\u8003\u8651\u4f7f\u7528\u8001\u7248\u672c JDK \u6267\u884c\u7684 \u7a0b\u5e8f <code>hello.jar</code>\uff0c \u4f7f\u7528\u65b0\u7248\u672c JDK \uff0c\u5982\u679c\u4ecd\u7136\u53ef\u4ee5\u6267\u884c\uff0c\u90a3\u4e48\u8ba4\u4e3a\u662f\u8fd0\u884c\u65f6\u517c\u5bb9\u7684\u3002 \u8fd0\u884c\u65f6\u517c\u5bb9\u901a\u5e38 \u9002\u7528\u4e8e\u64cd\u4f5c\u7cfb\u7edf\uff0c\u8fd0\u884c\u5bb9\u5668\u7b49\u57fa\u7840\u8f6f\u4ef6\u5e73\u53f0\uff0c\u6216\u8005\u5b9e\u73b0\u6807\u51c6\u534f\u8bae\u7684\u8fd0\u884c\u73af\u5883\uff0c\u5982 JSP/Servlet \u7684\u5b9e\u73b0 Tomcat\u3002 \u5728\u65e9\u4e9b\u65f6\u5019\uff0c\u8fd9\u4e9b\u57fa\u7840\u8f6f\u4ef6\u5e73\u53f0\u7684\u517c\u5bb9\u6027\u4e00\u76f4\u505a\u7684\u4e0d\u9519\uff0c\u968f\u7740\u6280\u672f\u53d1\u5c55\u8d8a\u6765\u8d8a\u5feb\uff0c\u7528\u6237\u5bf9\u4e8e\u4f53\u9a8c\u8981\u6c42\u8d8a\u6765\u8d8a\u9ad8\uff0c \u57fa\u7840\u8f6f\u4ef6\u5e73\u53f0\u5728\u4fdd\u6301\u517c\u5bb9\u6027\u7684\u65b9\u9762\u8d8a\u6765\u8d8a\u653e\u5f00\uff0c\u517c\u5bb9\u7248\u672c\u8d8a\u6765\u8d8a\u5c11\u3002\u6bd4\u5982 windows 10 \u7684\u7248\u672c\u5e76\u4e0d\u517c\u5bb9\u90e8\u5206\u8001\u7684 \u6267\u884c\u7a0b\u5e8f\uff0cJDK 12 \u4e5f\u4e0d\u518d\u517c\u5bb9\u90e8\u5206 jar \u5305\uff0c\u82f9\u679c\u7684\u5e73\u53f0\u4e00\u76f4\u91c7\u53d6\u7684\u662f\u4e00\u79cd\u79ef\u6781\u7684\u5411\u524d\u770b\u7684\u7b56\u7565\uff0c\u591a\u6570\u65b0\u7248\u672c \u5e73\u53f0\u7684\u63a8\u51fa\uff0c\u90fd\u8981\u6c42\u5e94\u7528\u4f7f\u7528\u65b0\u7248\u672c\u5e73\u53f0\u91cd\u65b0\u7f16\u8bd1\u540e\u5728\u5e94\u7528\u5e02\u573a\u53d1\u5e03\u3002 </p> </li> <li> <p>\u7f16\u8bd1\u65f6\u517c\u5bb9\u3002\u7f16\u8bd1\u65f6\u517c\u5bb9\u662f\u7ec4\u4ef6/\u6a21\u5757\u7c7b\u8f6f\u4ef6\u5e38\u89c1\u7684\u517c\u5bb9\u6027\u7c7b\u578b\uff0c\u6bd4\u5982 ServiceComb\uff0c \u901a\u5e38\u4f5c\u4e3a\u8fd0\u884c\u7a0b\u5e8f\u7684\u4e00\u90e8\u5206\uff0c \u901a\u8fc7\u7f16\u8bd1\u5de5\u5177\uff0c\u4e0e\u4e1a\u52a1\u4ee3\u7801\u4e00\u8d77\u7f16\u8bd1\u4e3a\u53ef\u6267\u884c\u7684\u7a0b\u5e8f\u3002 \u4ee5 ServiceComb \u4e3a\u4f8b\uff0c\u4f7f\u7528\u5b83\u7684\u5e94\u7528\u7a0b\u5e8f\u91c7\u7528 maven \u5de5\u5177 \u8fdb\u884c\u7f16\u8bd1\uff0c\u5982\u679c\u80fd\u591f\u901a\u8fc7\u4fee\u6539\u4f9d\u8d56\u7684 pom \u7684\u7248\u672c\u53f7\uff0c\u7f16\u8bd1\u901a\u8fc7\uff0c\u5e76\u4e14\u529f\u80fd\u6ca1\u6709\u53d8\u5316\uff0c\u90a3\u4e48\u5c31\u8ba4\u4e3a\u662f\u7f16\u8bd1\u65f6\u517c\u5bb9\u3002 \u7f16\u8bd1\u53ef\u4ee5\u8ba4\u4e3a\u662f\u5f00\u53d1 \u8fc7\u7a0b\u7684\u4e00\u90e8\u5206\uff0c\u4e0d\u517c\u5bb9\u5bfc\u81f4\u7684\u7f16\u8bd1\u5931\u8d25\uff0c\u901a\u5e38\u4e0d\u4f1a\u7ed9\u6700\u7ec8\u7528\u6237\u5e26\u6765\u5f71\u54cd\uff0c\u7ec4\u4ef6\u4f7f\u7528\u8005\u901a\u8fc7\u4fee\u6539\u7f16\u8bd1\u4e0d\u901a\u8fc7\u7684\u6a21\u5757\uff0c\u4f7f\u7528 \u65b0\u63d0\u4f9b\u7684 API\uff0c\u5c31\u80fd\u591f\u7f16\u8bd1\u901a\u8fc7\u3002\u7f16\u8bd1\u4e0d\u517c\u5bb9\u7684\u4fee\u6b63\u4f1a\u6d89\u53ca\u63a5\u53e3\u7684\u66ff\u6362\uff0c\u5982\u679c\u65b0\u66ff\u6362\u7684\u63a5\u53e3\u4e0e\u8001\u63a5\u53e3\u529f\u80fd\u4e0d\u4e00\u81f4\uff0c\u800c \u5f00\u53d1\u8005\u53c8\u6ca1\u6709\u9488\u5bf9\u8fd9\u4e9b\u53d8\u66f4\u7684\u529f\u80fd\u8fdb\u884c\u6d4b\u8bd5\uff0c\u5219\u53ef\u80fd\u5c06\u95ee\u9898\u9057\u6f0f\u5230\u6700\u7ec8\u7528\u6237\u3002 \u4fee\u6b63\u7f16\u8bd1\u4e0d\u517c\u5bb9\u95ee\u9898\u9700\u8981\u6709\u66ff\u6362\u7684\u63a5\u53e3\uff0c\u5982\u679c \u6ca1\u6709\u53ef\u66ff\u6362\u7684\u63a5\u53e3\uff0c\u90a3\u4e48\u5f00\u53d1\u8005\u6ca1\u6cd5\u4f7f\u7528\u65b0\u7248\u672c\uff0c\u8fd9\u4e2a\u4e0d\u4f1a\u7ed9\u6700\u7ec8\u7528\u6237\u5e26\u6765\u5f71\u54cd\uff0c\u5f00\u53d1\u8005\u9700\u8981\u8054\u7cfb\u7ec4\u4ef6\u63d0\u4f9b\u8005\u63d0\u4f9b\u5bf9\u5e94\u7684 \u89e3\u51b3\u65b9\u6848\u6ee1\u8db3\u8981\u6c42\u3002\u7ec4\u4ef6\u7684\u7f16\u8bd1\u65f6\u517c\u5bb9\u505a\u7684\u6bd4\u8f83\u597d\u7684\u4e00\u822c\u662f\u4e00\u4e9b\u7b97\u6cd5\u7c7b\u3001\u534f\u8bae\u7c7b\u7ec4\u4ef6\uff0c\u6bd4\u5982 JDK \u7684\u6570\u636e\u7ed3\u6784\u5e93\uff0cjackson \u7684 JSON \u89e3\u6790\u5e93\uff0c\u8d8a\u662f\u9762\u5411\u5e94\u7528\u5c42\uff0c\u7f16\u8bd1\u4e0d\u517c\u5bb9\u7684\u60c5\u51b5\u8d8a\u662f\u53d1\u751f\u9891\u7e41\uff0c\u6bd4\u5982 spring cloud \u76f8\u5173\u7684\u5e93\u3002</p> </li> <li> <p>\u670d\u52a1\u63a5\u53e3\u517c\u5bb9\u3002 \u670d\u52a1\u63a5\u53e3\u662f\u5e94\u7528\u670d\u52a1\u5316\u4ee5\u540e\u51fa\u73b0\u7684\u6982\u5ff5\uff0c\u901a\u5e38\u8868\u793a\u4e3a\u5e94\u7528\u5bf9\u5916\u63d0\u4f9b\u7684 REST \u63a5\u53e3\u3002 \u670d\u52a1\u63a5\u53e3\u7531\u4e8e\u90fd\u662f \u5728\u7ebf\u4f7f\u7528\uff0c\u4e00\u65e6\u63a5\u53e3\u53d8\u5316\uff0c\u5c31\u53ef\u80fd\u5bf9\u4f7f\u7528\u8005\u7684\u4e1a\u52a1\u7cfb\u7edf\u4ea7\u751f\u5f71\u54cd\u3002\u670d\u52a1\u63a5\u53e3\u7684\u517c\u5bb9\u6027\u95ee\u9898\uff0c\u4f7f\u7528\u8005\u4e5f\u65e0\u6cd5\u901a\u8fc7\u79bb\u7ebf\u7f16\u8bd1 \u53d1\u73b0\uff0c\u6240\u6709\u7684\u95ee\u9898\u90fd\u662f\u5bf9\u7528\u6237\u4ea7\u751f\u5f71\u54cd\u540e\u624d\u88ab\u53d1\u73b0\uff0c\u56e0\u6b64\u670d\u52a1\u63a5\u53e3\u7684\u517c\u5bb9\u663e\u5f97\u5c24\u5176\u91cd\u8981\u3002 </p> </li> </ul> <p>\u6839\u636e\u4e0a\u9762\u7684\u517c\u5bb9\u6027\u573a\u666f\uff0c\u53ef\u4ee5\u6309\u7167\u517c\u5bb9\u6027\u7b26\u5408\u5ea6\uff0c\u5206\u4e3a\u4e0b\u9762\u51e0\u7c7b\u3002</p> <ul> <li>\u5b8c\u7f8e\u3002\u5b8c\u7f8e\u8fd0\u884c\u65f6\u517c\u5bb9\u4ee3\u8868\u8001\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u4e0d\u9700\u8981\u91cd\u65b0\u7f16\u8bd1\u5c31\u53ef\u4ee5\u5728\u65b0\u73af\u5883\u6267\u884c\uff1b\u5b8c\u7f8e\u7f16\u8bd1\u65f6\u517c\u5bb9\u4ee3\u8868\u4f7f\u7528\u65b0\u7248\u672c\u7f16\u8bd1\u65f6 \u4e0d\u4f1a\u51fa\u73b0\u7f16\u8bd1\u9519\u8bef\uff0c\u5e76\u4e14\u8fd0\u884c\u65f6\u884c\u4e3a\u4e00\u81f4\u3002</li> <li>\u6070\u5f53\u3002\u6070\u5f53\u8fd0\u884c\u65f6\u517c\u5bb9\u4ee3\u8868\u8001\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u4f7f\u7528\u65b0\u5e73\u53f0\u63d0\u4f9b\u7684\u7f16\u8bd1/\u6253\u5305\u7b49\u5de5\u5177\u91cd\u65b0\u7f16\u8bd1\u4fee\u6539\uff0c\u5982\u679c\u5b58\u5728\u5931\u8d25\uff0c\u6839\u636e\u76f8\u5173\u7684\u6307\u5f15 \u4fee\u590d\u91cd\u65b0\u53d1\u5e03\uff0c\u80fd\u591f\u7ee7\u7eed\u8fd0\u884c\uff0c\u5728\u65b0\u5e73\u53f0\u8fd0\u884c\u7684\u6548\u679c\u548c\u8001\u7248\u672c\u4e00\u81f4\u3002\u6070\u5f53\u7f16\u8bd1\u65f6\u517c\u5bb9\u6307\u5b58\u5728\u7f16\u8bd1\u5931\u8d25\uff0c\u4f7f\u7528\u65b0\u7248\u672c\u7684API\u66ff\u6362 \u8001\u7684API\u7f16\u8bd1\u901a\u8fc7\u540e\uff0c\u5e94\u7528\u7a0b\u5e8f\u7684\u884c\u4e3a\u548c\u8001\u7248\u672c\u4e00\u81f4\u3002\u6070\u5f53\u517c\u5bb9\u548c\u4fee\u6539\u5de5\u4f5c\u91cf\u6709\u5173\u7cfb\uff0c\u6bd4\u5982\u8001\u7248\u672c\u5207\u6362\u4e3a\u65b0\u7248\u672c\uff0c\u5982\u679c\u5de5\u4f5c\u91cf \u80fd\u591f\u63a7\u5236\u57281\u4eba\u5929\uff0c \u53ef\u4ee5\u8ba4\u4e3a\u662f\u6070\u5f53\u517c\u5bb9\u3002 </li> <li>\u4e0d\u517c\u5bb9\u3002\u4e0d\u517c\u5bb9\u6307\u4fee\u6539\u5de5\u4f5c\u91cf\u8d85\u8fc7\u53ef\u63a5\u7eb3\u7684\u9650\u5ea6\uff0c\u6216\u8005\u67d0\u4e2a\u63a5\u53e3\u6ca1\u6709\u66ff\u6362\u65b9\u6848\u3002</li> </ul>"},{"location":"featured-topics/compatibility.html#servicecomb","title":"ServiceComb \u7684\u517c\u5bb9\u6027\u7b56\u7565","text":"<p>ServiceComb \u5b58\u5728\u591a\u4e2a\u4e0d\u540c\u7684\u7ec4\u4ef6\uff0c\u5bf9\u4e8e\u4e2d\u95f4\u4ef6\u7c7b\u670d\u52a1\uff0c\u6bd4\u5982 servicecomb-service-center \u7684\u517c\u5bb9\u6027\u7b56\u7565\u662f \u670d\u52a1\u63a5\u53e3\u517c\u5bb9\u3002 \u5bf9\u4e8e\u5f00\u53d1 SDK \u7c7b\uff0c\u6bd4\u5982 servicecomb-java-chassis \u7684\u517c\u5bb9\u6027\u7b56\u7565\u662f<code>\u6070\u5f53\u7684\u7f16\u8bd1\u65f6\u517c\u5bb9</code>\u3002 </p> <p>\u76f8\u5bf9\u4e8e\u5b9e\u9645\u60c5\u51b5\uff0c\u4e0a\u9762\u7684\u7b56\u7565\u63cf\u8ff0\u4ecd\u7136\u6bd4\u8f83\u7b80\u5355\uff0c\u56e0\u4e3a\u5b9e\u9645\u60c5\u51b5\u6bd4\u8bbe\u60f3\u7684\u60c5\u51b5\u8981\u590d\u6742\u7684\u591a\u3002\u672c\u6587\u5173\u4e8e\u517c\u5bb9\u6027\u573a\u666f\u7684\u63cf\u8ff0\uff0c \u5e76\u4e0d\u80fd\u6982\u51b5\u6240\u6709\u7684\u517c\u5bb9\u6027\u573a\u666f\uff0c\u6bd4\u5982\u5bf9\u4e8e SDK \u7c7b\uff0c\u4e5f\u53ef\u80fd\u5b58\u5728\u8fd0\u884c\u65f6\u517c\u5bb9\u7684\u8981\u6c42\uff0c\u7279\u522b\u662f\u6709\u4e9b\u4e1a\u52a1\u7cfb\u7edf\u662f\u57fa\u4e8e\u8001\u7684\u6784\u5efa \u5de5\u5177\uff0c\u6bd4\u5982 ANT \u7684\u60c5\u51b5\uff0c\u4e1a\u52a1\u53ef\u80fd\u9700\u8981\u66ff\u6362 jar \u7684\u65b9\u5f0f\u6ee1\u8db3\u517c\u5bb9\u6027\u8981\u6c42\u3002 SDK \u7c7b\u4e5f\u5b58\u5728\u670d\u52a1\u63a5\u53e3\u517c\u5bb9\u7684\u8981\u6c42\uff0c\u6bd4\u5982 \u901a\u8fc7 SDK \u7684 <code>HIGHWAY</code> \u53d1\u5e03\u63a5\u53e3\uff0c\u5982\u679c <code>HIGHWAY</code> \u5e95\u5c42\u7684\u901a\u4fe1\u534f\u8bae\u6216\u8005\u7f16\u89e3\u7801\u65b9\u5f0f\u53d1\u751f\u53d8\u5316\uff0c\u5219\u53ef\u80fd\u5bfc\u81f4\u670d\u52a1 \u63a5\u53e3\u4e0d\u517c\u5bb9\u3002 </p> <p>\u4e3a\u4e86\u5bf9\u5404\u79cd\u590d\u6742\u7684\u517c\u5bb9\u6027\u573a\u666f\u8fdb\u884c\u6709\u6548\u7ba1\u7406\uff0cjava-chassis \u4f7f\u7528 3 \u4f4d\u7248\u672c\u53f7(major.minor.patch)\u9002\u5f53\u533a\u5206\uff1a</p> <ul> <li>patch: \u6070\u5f53\u7684\u7f16\u8bd1\u65f6\u517c\u5bb9\u7248\u672c\u3002\u5347\u7ea7 patch \u7248\u672c\uff0c\u901a\u5e38\u5de5\u4f5c\u91cf\u53ef\u4ee5\u63a7\u5236\u57281\u4eba\u5929\u4ee5\u5185\u3002patch \u7248\u672c\u591a\u6570\u53ea\u9700\u8981 \u5347\u7ea7\u7248\u672c\u53f7\uff0c\u7136\u540e\u91cd\u65b0\u7f16\u8bd1\u53d1\u5e03\u5373\u53ef\u3002 \u5c11\u91cf\u7684\u7248\u672c\u53ef\u80fd\u5b58\u5728\u5f71\u54cd\u6781\u5c0f\u7684\u4e0d\u517c\u5bb9\u8c03\u6574\uff0c\u6bd4\u5982\u5c06\u65b9\u6cd5 <code>wong</code> \u91cd\u547d\u540d \u4e3a <code>wrong</code>\u3002</li> <li>minor: \u6070\u5f53\u7684\u7f16\u8bd1\u65f6\u517c\u5bb9\u7248\u672c\u3002\u76f8\u8f83\u4e8e patch \u7248\u672c\uff0c minor \u7248\u672c\u53ef\u80fd\u5b58\u5728\u66f4\u591a\u7684\u65b0\u7279\u6027\u4ea4\u4ed8\uff0c\u9879\u76ee\u7ed3\u6784\u5b58\u5728 \u4e00\u5b9a\u7a0b\u5ea6\u7684\u91cd\u6784\uff0c\u4f7f\u7528\u5185\u90e8 API \u7684\u5f00\u53d1\u8005\u53ef\u80fd\u9700\u8981\u89e3\u51b3\u8f83\u591a\u7684\u7f16\u8bd1\u95ee\u9898\uff0c\u4f7f\u7528\u65b0\u7684 API \u66ff\u6362\u8001\u7684 API\u3002minor \u7248\u672c\u7684\u5347\u7ea7\u5de5\u4f5c\u91cf\u901a\u5e38\u63a7\u5236\u57283\u4eba\u5929\u4ee5\u5185\u3002</li> <li>major\uff1a\u63d0\u4f9b major \u7248\u672c\uff0c\u901a\u5e38\u662f\u7531\u4e8e\u67d0\u4e9b\u7279\u6027\u53ef\u80fd\u5bfc\u81f4\u8fd0\u884c\u65f6\u517c\u5bb9\u95ee\u9898\u3002\u6bd4\u5982 <code>2.0.0</code> \u7248\u672c\u7684 <code>HIGHWAY</code> \u534f\u8bae\u7684\u4fee\u6539\u3002 \u56e0\u4e3a\u8fd0\u884c\u65f6\u517c\u5bb9\u51fa\u73b0\u7684\u65f6\u5019\uff0c\u53ea\u8981\u4f7f\u7528\u4e86\u8be5\u529f\u80fd\u7684\u6240\u6709\u5fae\u670d\u52a1\u90fd\u9700\u8981\u4e00\u5e76\u5347\u7ea7\uff0c\u5de5\u4f5c\u91cf\u4ece\u5355\u4e2a\u670d\u52a1\u63d0\u5347 \u5230\u6574\u4e2a\u5e94\u7528\uff0c\u89c6\u5e94\u7528\u7684\u89c4\u6a21\u5927\u5c0f\uff0c\u5de5\u4f5c\u91cf\u4f1a\u5dee\u522b\u5f88\u5927\u3002\u5f53\u7136\u5e76\u4e0d\u610f\u5473\u7740 major \u7248\u672c\u5347\u7ea7\u4e00\u5b9a\u975e\u5e38\u590d\u6742\uff0c\u5b9e\u9645\u4e0a\u6ca1\u6709 \u4f7f\u7528 <code>HIGHWAY</code> \u7684\u60c5\u51b5\uff0c2.0.0 \u5347\u7ea7\u7684\u5de5\u4f5c\u91cf\u4ecd\u7136\u4e0d\u8d85\u8fc7\u4e00\u822c\u7684 minor \u7248\u672c\u3002\u9488\u5bf9 major \u7248\u672c\uff0c ServiceComb \u4f1a\u63d0\u4f9b\u76f8\u5173\u7684\u5347\u7ea7\u6307\u5bfc\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u8bc4\u4f30\u517c\u5bb9\u6027\u5f71\u54cd\u3002</li> </ul> <p>java-chassis \u81ea\u8eab\u4e5f\u4f7f\u7528\u4e86\u5927\u91cf\u7684\u4e09\u65b9\u4ef6\uff0c\u4e3a\u4e86\u66f4\u597d\u7684\u5e73\u8861\u5347\u7ea7\u6548\u7387\u548c\u9879\u76ee\u7684\u6301\u7eed\u9ad8\u8d28\u91cf\u53d1\u5c55\uff0c\u4e0b\u9762\u603b\u7ed3\u4e86\u4e00\u4e9b \u517c\u5bb9\u6027\u7ba1\u7406\u7684\u4f18\u79c0\u5b9e\u8df5\u4ee5\u53ca\u5bf9\u4e8e\u5f00\u53d1\u8005\u7684\u5efa\u8bae\uff1a</p> <ul> <li>\u5c3d\u53ef\u80fd\u4f7f\u7528\u6838\u5fc3 API\uff0c\u51cf\u5c11\u91cd\u6784\u5bf9\u4e8e\u4ea7\u54c1\u517c\u5bb9\u7684\u5f71\u54cd\u3002\u533a\u5206\u6838\u5fc3 API \u662f\u9700\u8981\u4e00\u4e9b\u5f00\u53d1\u7ecf\u9a8c\u7684\uff0cjava-chassis \u5e76 \u6ca1\u6709\u7ed9\u51fa\u6838\u5fc3 API \u7684\u8303\u56f4\u548c\u72ec\u7acb\u6587\u6863\u8bf4\u660e\u3002 \u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u5f0f\u662f\u9605\u8bfb\u5f00\u53d1\u6307\u5357\uff0c\u5f00\u53d1\u6307\u5357\u91cc\u9762\u63d0\u5230\u7684\u4f7f\u7528\u65b9\u6cd5\uff0c\u5c31\u662f \u6838\u5fc3 API \u7684\u5185\u5bb9\uff0c\u6bd4\u5982\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3\u7684 JAX RS \u6807\u7b7e\u6216\u8005Spring MVC\u6807\u7b7e\uff0c <code>Handler</code> \u548c <code>Invocation</code> \u6838\u5fc3\u6a21\u578b\uff0c\u4ee5\u53ca\u4e0d\u540c\u7684\u6a21\u5757\u63d0\u4f9b\u7684\u914d\u7f6e\u9879\u7b49\u3002 </li> <li>\u4f7f\u7528\u975e\u6838\u5fc3 API \u7684\u65f6\u5019\uff0c\u9002\u5f53\u589e\u52a0\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u3002\u7531\u4e8e\u4e1a\u52a1\u7684\u9700\u8981\uff0c\u4f7f\u7528\u975e\u6838\u5fc3 API \u4e0d\u53ef\u907f\u514d\uff0c\u6bd4\u5982\u6709\u4e9b\u4e1a\u52a1\u9700\u8981 \u4f7f\u7528\u670d\u52a1\u4e2d\u5fc3\u7684 API \u66f4\u65b0\u670d\u52a1\u72b6\u6001\uff0c\u8c03\u7528 <code>RegistryUtils</code> \u7684\u63a5\u53e3\u3002 \u4e0d\u7528\u62c5\u5fc3\u8fd9\u4e9b API \u53d8\u5316\u800c\u4e0d\u6562\u4f7f\u7528\uff0c \u5148\u9488\u5bf9\u4f7f\u7528\u8fd9\u4e9b API \u7684\u573a\u666f\u6216\u8005\u76f4\u63a5\u9488\u5bf9\u8fd9\u4e2a API \u5199\u4e00\u4e9b\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u3002\u5347\u7ea7\u7248\u672c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b API \u7684 \u539f\u578b\u53d8\u5316\u751a\u81f3\u8bed\u4e49\u53d8\u5316\uff0c\u90fd\u80fd\u591f\u53ca\u65f6\u88ab\u53d1\u73b0\u3002 </li> <li>\u6301\u7eed\u5347\u7ea7\u65b0\u7248\u672c\u662f\u4e00\u628a\u53cc\u5203\u5251\uff0c\u4f46\u603b\u4f53\u6765\u8bb2\uff0c\u6536\u76ca\u8fdc\u5927\u4e8e\u95ee\u9898\u3002\u5982\u679c\u4e1a\u52a1\u7cfb\u7edf\u9700\u8981\u4e0d\u65ad\u7684\u66f4\u65b0\uff0c\u5efa\u8bae\u5c31\u5e94\u8be5\u5728\u6bcf\u4e2a\u4ea7\u54c1 \u8fed\u4ee3\u4e2d\u5b89\u6392\u4e00\u4e2a\u4efb\u52a1\u5347\u7ea7\u65b0\u7248\u672c\u3002java-chassis \u7684\u6bcf\u4e2a\u7248\u672c\u8fed\u4ee3\uff0c\u90fd\u56fa\u5b9a\u4f1a\u5b89\u6392\u5347\u7ea7\u4e09\u65b9\u4ef6\u7684\u4efb\u52a1\u3002\u53ca\u65f6\u5347\u7ea7\u7248\u672c\uff0c \u80fd\u591f\u5feb\u901f\u4fee\u590d\u8001\u7248\u672c\u5b58\u5728\u7684\u5b89\u5168\u6f0f\u6d1e\uff0c\u89e3\u51b3\u8001\u7248\u672c\u5df2\u77e5\u7684\u53ef\u9760\u6027\u3001\u6027\u80fd\u95ee\u9898\u3001\u53d1\u73b0\u7684bug\uff1b\u8fd8\u80fd\u591f\u8bc6\u522b\u51fa\u4e00\u4e9b\u9519\u8bef\u7684 \u5e9f\u5f03\u7528\u6cd5\uff0c\u53ca\u65f6\u8c03\u6574\u4e3a\u6b63\u786e\u7684\u7528\u6cd5\uff0c\u4f7f\u7528\u65b0\u7684\u7248\u672c\uff0c\u66f4\u5bb9\u6613\u4ece\u793e\u533a\u83b7\u5f97\u5bf9\u4e8e\u65b0\u53d1\u73b0\u95ee\u9898\u7684\u5e2e\u52a9\u3002\u6301\u7eed\u5347\u7ea7\u662f\u4e00\u4e2a\u7cfb\u7edf \u7684\u5de5\u7a0b\u5b9e\u8df5\uff0c\u4e0d\u5355\u5355\u6307\u5347\u7ea7\u7248\u672c\uff0c\u8fd8\u5305\u62ec\u4e3a\u4e86\u9884\u9632\u5347\u7ea7\u7248\u672c\u7ed9\u8d28\u91cf\u5e26\u6765\u98ce\u9669\u800c\u91c7\u53d6\u7684\u5176\u4ed6\u63aa\u65bd\uff0c\u6bd4\u5982\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u6301\u7eed \u6784\u5efa\uff0c\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u7684\u6784\u5efa\uff0c\u5b9a\u671f\u9605\u8bfb\u91cd\u8981\u9879\u76ee\u7684 Release Notes\uff0c\u5173\u6ce8\u9879\u76ee\u53d1\u5c55\u65b9\u5411\u7b49\u7b49\u3002 \u8fd9\u79cd\u65b9\u5f0f\u662f\u4e00\u79cd\u4e3b\u52a8 \u8d28\u91cf\u52a0\u56fa\u63aa\u65bd\uff0c\u53ef\u4ee5\u514d\u4e8e\u95ee\u9898\u53d1\u751f\u3002\u53ef\u60dc\u591a\u6570\u51b3\u7b56\u8005\u770b\u5230\u7684\u662f\u66f4\u65b0\u7248\u672c\u5e26\u6765\u7684\u95ee\u9898\uff0c\u770b\u4e0d\u5230\u9884\u9632\u63aa\u65bd\u7684\u79ef\u6781\u6548\u679c\uff0c \u6ca1\u6709\u628a\u6301\u7eed\u5347\u7ea7\u4f5c\u4e3a\u4e00\u9879\u91cd\u8981\u7684\u80fd\u529b\u5efa\u8bbe\u4e8b\u9879\u7eb3\u5165\u8ba1\u5212\uff0c\u8fd9\u9879\u80fd\u529b\u4e00\u76f4\u5f97\u4e0d\u5230\u63d0\u5347\uff0c\u5f53\u5b9e\u65bd\u5347\u7ea7\u7684\u65f6\u5019\uff0c\u66f4\u5bb9\u6613\u5f15\u5165\u6545\u969c\u3002</li> </ul>"},{"location":"featured-topics/features.html","title":"\u7279\u6027\u4ecb\u7ecd","text":"<ul> <li>\u7279\u6027\u4ecb\u7ecd\uff1a date\u548cdate-time</li> <li>\u7279\u6027\u4ecb\u7ecd\uff1a Edge Service \u901a\u7528\u7684 HTTP \u8f6c\u53d1\u5668 CommonHttpEdgeDispatcher</li> </ul>"},{"location":"featured-topics/performance.html","title":"\u6027\u80fd\u95ee\u9898\u5206\u6790\u548c\u8c03\u4f18","text":"<p>\u6027\u80fd\u4f18\u5316\u662f\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u5f88\u91cd\u8981\u7684\u73af\u8282\uff0c\u4e5f\u662f\u6bd4\u8f83\u590d\u6742\u7684\u8fc7\u7a0b\u3002\u5206\u6790\u6027\u80fd\u95ee\u9898\u7684\u5173\u952e\u662f\u80fd\u591f\u6536\u96c6\u5230\u5c3d\u53ef\u80fd\u591a\u7684\u4fe1\u606f\uff0c\u8bc6\u522b\u6027\u80fd\u74f6\u9888\u3002 Java Chassis\u9488\u5bf9\u6027\u80fd\u5206\u6790\u63d0\u4f9b\u7684\u6700\u6709\u7528\u5de5\u5177\u662f\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u3002\u5e94\u7528\u6027\u80fd\u76d1\u63a7 \u9ed8\u8ba4\u5468\u671f\u6027\u6536\u96c6\u7cfb\u7edf\u6027\u80fd\u6570\u636e\uff0c\u5e76\u5c06\u6570\u636e\u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6\u3002\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u6570\u636e\u7edf\u8ba1\u63d0\u4f9b\u4e86\u975e\u5e38\u9ad8\u6548\u7684\u5b9e\u73b0\uff0c\u5efa\u8bae\u5e94\u7528\u7a0b\u5e8f\u9ed8\u8ba4\u6253\u5f00\u3002</p> <p>\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u63a8\u8350\u4e0b\u9762\u7684\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n metrics:\n window_time: 60000\n invocation:\n latencyDistribution: 0,1,10,100,1000\n Consumer.invocation.slow:\n enabled: true\n msTime: 1000\n Provider.invocation.slow:\n enabled: true\n msTime: 1000\n publisher.defaultLog:\n enabled: true\n endpoints.client.detail.enabled: true\n</code></pre> <p>\u7ed3\u5408\u4e1a\u52a1\u81ea\u5df1\u7684\u65e5\u5fd7\u7cfb\u7edf\uff0c\u53ef\u4ee5\u5c06\u6027\u80fd\u7edf\u8ba1\u65e5\u5fd7\u5b58\u50a8\u5230\u72ec\u7acb\u7684\u65e5\u5fd7\u6587\u4ef6\uff0c\u51cf\u5c11\u5bf9\u4e1a\u52a1\u65e5\u5fd7\u67e5\u770b\u7684\u5e72\u6270\u3002</p>"},{"location":"featured-topics/performance.html#_2","title":"\u5173\u952e\u5904\u7406\u73af\u8282","text":"<p>\u5728 <code>RPC</code> \u8bf7\u6c42\u7684\u5904\u7406\u8fc7\u7a0b\u4e2d\uff0c\u6709\u4e9b\u5904\u7406\u73af\u8282\u975e\u5e38\u91cd\u8981\uff0c\u591a\u6570\u6027\u80fd\u74f6\u9888\u90fd\u548c\u8fd9\u4e9b\u73af\u8282\u6709\u5173\u3002<code>Java Chassis</code> \u6838\u5fc3\u5904\u7406\u73af\u8282\u53ef\u4ee5\u7b80\u5355\u6982\u8ff0\u4e3a\uff1a</p> <ul> <li>Provider\u6d41\u7a0b : \u63a5\u6536\u8bf7\u6c42 -&gt; \u521b\u5efa Producer Invocation -&gt; \u6267\u884c\u5904\u7406\u94fe -&gt; \u6267\u884c\u4e1a\u52a1\u903b\u8f91 -&gt; \u6267\u884c\u5904\u7406\u94fe -&gt; \u53d1\u9001\u54cd\u5e94</li> <li>Consumer\u6d41\u7a0b : \u521b\u5efa Producer Invocation -&gt; \u6267\u884c\u5904\u7406\u94fe -&gt; \u53d1\u9001\u8bf7\u6c42 -&gt; \u7b49\u5f85\u54cd\u5e94 -&gt; \u6267\u884c\u5904\u7406\u94fe</li> </ul> <p>\u5728<code>Provider\u6d41\u7a0b</code>\u4e2d\uff0c\u5b58\u5728\u7ebf\u7a0b\u6c60\u8d44\u6e90\uff0c\u7ebf\u7a0b\u6c60\u7ade\u4e89\u7684\u65f6\u95f4\u901a\u8fc7 <code>queue</code> \u6765\u8868\u793a\u3002 \u5728 <code>Consumer\u6d41\u7a0b</code>\u4e2d\uff0c\u5b58\u5728\u8fde\u63a5\u6c60\u8d44\u6e90\uff0c\u8fde\u63a5\u6c60\u7ade\u4e89\u7684\u65f6\u95f4\u901a\u8fc7 <code>connection</code> \u6765\u8868\u793a\u3002 \u7f51\u8def\u4f20\u8f93\u7684\u65f6\u95f4\u5728 <code>metrics</code> \u91cc\u9762\u672a\u4f53\u73b0\uff0c\u4e00\u4e9b\u6027\u80fd\u4f18\u5316\u95ee\u9898\uff0c\u8fd8\u9700\u8981\u7ed3\u5408\u5e73\u65f6\u7684\u6027\u80fd\u6d4b\u8bd5\u7ecf\u9a8c\u6570\u636e\uff0c\u6765\u5224\u65ad\u662f\u5426\u5b58\u5728\u6027\u80fd\u95ee\u9898\uff0c\u6bd4\u5982\uff0c<code>Consumer\u6d41\u7a0b</code>\u7684<code>wait</code>\u8868\u793a\u7b49\u5f85\u54cd\u5e94\u65f6\u95f4\uff0c\u5982\u679c\u4ece<code>Provider</code>\u7684 metrics \u65e5\u5fd7\u4e2d\uff0c\u67e5\u8be2\u5230\u603b\u7684\u5904\u7406\u65f6\u95f4\u4e3a 100ms\uff0c <code>wait</code> \u65f6\u95f4\u53ef\u80fd\u4e3a 200ms\uff0c \u4e2d\u95f4\u7684100ms\u65f6\u95f4\u662f metrics \u7edf\u8ba1\u4e0d\u5230\u7684\u65f6\u95f4\uff0c\u8fd9\u4e9b\u65f6\u95f4\u901a\u5e38\u7528\u4e8e\u7f51\u7edc\u8d44\u6e90\u7684\u7ade\u4e89\uff0c\u7531\u64cd\u4f5c\u7cfb\u7edf\u7b49\u5e95\u5c42\u5904\u7406\u7a0b\u5e8f\u7ba1\u7406\u3002 </p> <p>\u9700\u8981\u8be6\u7ec6\u4e86\u89e3 Java Chassis\u7684\u5904\u7406\u73af\u8282\uff0c\u53ef\u4ee5\u901a\u8fc7\u4e0b\u8f7d\u6e90\u7801\uff0c\u67e5\u770b <code>InvocationStageTrace</code> \u7684\u5404\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u901a\u8fc7\u6b64\u65b9\u6cd5\uff0c\u80fd\u591f\u5feb\u901f\u4e86\u89e3 Java Chassis\u7684\u4ee3\u7801\u7ed3\u6784\u548c\u5404\u4e2a metrics \u73af\u8282\u7684\u8be6\u7ec6\u542b\u4e49\u3002 </p>"},{"location":"featured-topics/performance.html#_3","title":"\u65f6\u5ef6\u6ce2\u52a8","text":"<p>\u4efb\u4f55\u5904\u7406\u73af\u8282\u7684\u5904\u7406\u65f6\u95f4\u90fd\u53ef\u80fd\u5b58\u5728\u6ce2\u52a8\uff0c\u5373\u4f7f\u8fd9\u4e2a\u73af\u8282\u7684\u5904\u7406\u903b\u8f91\u975e\u5e38\u7b80\u5355\uff0c\u6bd4\u5982\u4e1a\u52a1\u903b\u8f91\u4e2d\u53ea\u5305\u542b\u4e86\u4e00\u6bb5 <code>a+b</code> \u7684\u8ba1\u7b97\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c\u3002 \u5728 Java \u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u9020\u6210\u6ce2\u52a8\u7684\u56e0\u7d20\u5927\u6982\u6709\u5982\u4e0b\u51e0\u79cd\u60c5\u51b5\uff1a</p> <ul> <li>\u5e76\u53d1\u8bf7\u6c42\u3002\u5e76\u53d1\u8bf7\u6c42\u4f1a\u7ade\u4e89CPU\u8d44\u6e90\uff0c\u8bf7\u6c42\u8d8a\u591a\uff0c\u903b\u8f91\u88ab\u4e2d\u65ad\u548c\u5ef6\u8fdf\u5904\u7406\u7684\u6982\u7387\u5c31\u4f1a\u589e\u591a\uff0c\u8868\u73b0\u4e3a\u6574\u4f53\u5904\u7406\u65f6\u95f4\u53d8\u957f\u3002</li> <li>\u5783\u573e\u56de\u6536\u3002Java \u6267\u884c\u5783\u573e\u56de\u6536\u4f1a\u4e2d\u65ad\u5904\u7406\u8fc7\u7a0b\uff0c\u4e5f\u4f1a\u8868\u73b0\u4e3a\u903b\u8f91\u5904\u7406\u53d8\u957f\u3002 </li> </ul> <p>\u56e0\u6b64\uff0c\u5f53\u8bc6\u522b\u5230 <code>metrics</code> \u7684\u67d0\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u5904\u7406\u73af\u8282\uff08\u6ca1\u6709IO\u3001\u6ca1\u6709\u9501\uff09\u7684\u65f6\u5ef6\u53d8\u957f\u7684\u65f6\u5019\uff0c\u8fd9\u901a\u5e38\u662f\u7cfb\u7edf\u7e41\u5fd9\u7684\u4e00\u79cd\u8868\u73b0\uff0c\u5728\u5206\u6790\u6027\u80fd\u74f6\u9888\u7684\u8fc7\u7a0b\u4e2d\uff0c \u9700\u8981\u6536\u96c6 CPU\u3001\u5185\u5b58\u4f7f\u7528\u7387\u3001TPS\u3001\u5783\u573e\u56de\u6536\u65f6\u95f4\u7b49\u6570\u636e\uff0c\u6765\u8fdb\u4e00\u6b65\u5224\u65ad\u89e6\u53d1\u6027\u80fd\u95ee\u9898\u7684\u539f\u56e0\u3002 </p>"},{"location":"featured-topics/performance.html#_4","title":"\u521d\u59cb\u5316\u8fc7\u7a0b\u7684\u65f6\u5ef6","text":"<p>\u5e94\u7528\u7a0b\u5e8f\u63a5\u6536\u7684\u7b2c\u4e00\u4e2a\u8bf7\u6c42\uff0c\u901a\u5e38\u65f6\u5ef6\u6bd4\u8f83\u9ad8\uff0c\u8fd9\u662f\u56e0\u4e3a\u5f88\u591a\u9884\u5904\u7406\u8fc7\u7a0b\u9700\u8981\u5728\u7b2c\u4e00\u6b21\u8bf7\u6c42\u7684\u521d\u59cb\u5316\u3002\u5305\u62ec\uff1a\u52a0\u8f7d\u670d\u52a1\u5143\u6570\u636e\u4fe1\u606f\u3001\u521d\u59cb\u5316\u7ebf\u7a0b\u6c60\u3001\u8fde\u63a5\u6c60\u3001\u5efa\u7acb\u8fde\u63a5\uff0c\u4ee5\u53ca\u4e1a\u52a1\u903b\u8f91\u7684\u521d\u59cb\u5316\u6570\u636e\u5e93\u7b49\u64cd\u4f5c\u3002\u8fd9\u4e9b\u521d\u59cb\u5316\u64cd\u4f5c\u901a\u5e38\u90fd\u4f1a\u4f7f\u7528\u9501\uff0c\u5982\u679c\u662f\u5e76\u53d1\u8bf7\u6c42\uff0c\u90a3\u4e48\u6bcf\u4e2a\u5e76\u53d1\u8bf7\u6c42\u7684\u5904\u7406\u65f6\u95f4\u90fd\u4f1a\u53d8\u957f\u3002 </p> <p>\u5728\u5e94\u7528\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4e5f\u53ef\u80fd\u51fa\u73b0\u7c7b\u4f3c\u7684\u521d\u59cb\u5316\u73b0\u8c61\u3002\u6bd4\u5982\u7cfb\u7edf\u5728\u665a\u95f4\u5f88\u4e45\u6ca1\u6709\u7528\u6237\u4f7f\u7528\uff0c\u4e0a\u73ed\u65f6\u95f4\u7a81\u7136\u5927\u91cf\u7528\u6237\u5e76\u53d1\u767b\u5f55\u3002 \u7cfb\u7edf\u672a\u4f7f\u7528\u671f\u95f4\uff0c\u6709\u4e9b\u8d44\u6e90\u4f1a\u88ab\u91ca\u653e\uff0c\u6bd4\u5982\u7ebf\u7a0b\u6c60\u3001\u8fde\u63a5\u6c60\uff0c\u7528\u6237\u4f1a\u8bdd\u4fe1\u606f\u7b49\u3002 </p> <p>\u521d\u59cb\u5316\u8fc7\u7a0b\u4f1a\u5f71\u54cd\u5230\u7cfb\u7edf\u6bdb\u523a\uff0c\u521d\u59cb\u5316\u8fc7\u7a0b\u8017\u65f6\uff0c\u4f1a\u5f71\u54cd\u5230\u7cfb\u7edf\u7684\u9519\u8bef\u7387\u3002\u7279\u522b\u662f\u8bbe\u7f6e\u975e\u5e38\u77ed\u7684\u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\u7684\u6761\u4ef6\u4e0b\u3002 </p>"},{"location":"featured-topics/performance.html#_5","title":"\u5176\u4ed6\u91cd\u8981\u73af\u8282\u7684\u65f6\u5ef6","text":"<ul> <li>\u7ebf\u7a0b\u6c60\u6392\u961f(queue) : \u63d0\u4f9b\u8005\u4e00\u822c\u4f1a\u901a\u8fc7\u7ebf\u7a0b\u6c60\u5904\u7406\u4e1a\u52a1\u903b\u8f91\u3002\u5982\u679c\u7ebf\u7a0b\u6c60\u51fa\u73b0\u6392\u961f\u8bf7\u6c42\uff0c\u5373\u4f7f\u6392\u961f\u8bf7\u6c42\u5f88\u5c11\uff0c\u4e5f\u610f\u5473\u7740\u5f53\u524d\u7684\u8bf7\u6c42\u9891\u7387\u8d85\u8fc7\u4e86\u7cfb\u7edf\u5904\u7406\u80fd\u529b\u3002\u9996\u5148\u53ef\u4ee5\u67e5\u770bCPU\u4f7f\u7528\u7387\uff0c\u5982\u679c\u4f7f\u7528\u7387\u9ad8\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u53ea\u80fd\u4f18\u5316\u6307\u4ee4\uff0c\u6216\u8005\u63d0\u5347\u5904\u7406\u80fd\u529b\uff1b\u5982\u679cCPU\u4f7f\u7528\u7387\u4f4e\uff0c\u53ef\u4ee5\u7ed3\u5408\u5806\u6808\u4fe1\u606f\uff0c\u8fdb\u4e00\u6b65\u5206\u6790\u5bfc\u81f4\u6392\u961f\u7684\u5177\u4f53\u903b\u8f91\u662f\u7b49\u5f85IO\u8fd8\u662f\u7531\u4e8e\u9501\u3001\u8d44\u6e90\u7ade\u4e89\u5bfc\u81f4\u7684\u3002</li> <li>\u83b7\u53d6\u8fde\u63a5\u6c60(connection): \u5efa\u7acb\u8fde\u63a5\u548c\u8fde\u63a5\u6c60\u7ade\u4e89\u662f <code>RPC</code> \u5e38\u89c1\u7684\u6027\u80fd\u74f6\u9888\u3002 \u5efa\u7acb\u8fde\u63a5\u662f\u6bd4\u8f83\u8017\u65f6\u7684\u64cd\u4f5c\uff0c\u4ee5 <code>HTTP</code> \u4e3a\u4f8b\uff0c \u5efa\u7acb\u4e00\u6b21\u8fde\u63a5\u901a\u5e38\u9700\u8981 <code>100ms</code> \u5de6\u53f3\u7684\u65f6\u95f4\uff0c\u670d\u52a1\u7aef\u901a\u5e38\u53ea\u80fd\u5904\u7406\u6570\u767e\u7684\u5e76\u53d1\u8fde\u63a5\u3002 \u5982\u679c\u5e76\u53d1\u8fc7\u5927\uff0c\u5c31\u4f1a\u5bfc\u81f4\u8fde\u63a5\u8d85\u65f6\u3002 \u6d89\u53ca\u8fde\u63a5\u8017\u65f6\u7684\u60c5\u51b5\uff0c\u9700\u8981\u901a\u8fc7\u8fde\u63a5\u6c60\u8bbe\u7f6e\uff0c\u5206\u6790\u9002\u5408\u8fd0\u884c\u73af\u5883\u9700\u8981\u7684\u6700\u5927\u8fde\u63a5\u6570\uff0c\u8fdb\u884c\u5408\u7406\u7684\u8fde\u63a5\u89c4\u5212\u3002 </li> </ul>"},{"location":"featured-topics/performance.html#_6","title":"\u6027\u80fd\u95ee\u9898\u5206\u6790","text":"<p>\u7efc\u5408\u4e0a\u9762\u7684\u4e00\u4e9b\u573a\u666f\uff0c\u53ef\u4ee5\u53d1\u4e0b\u6027\u80fd\u95ee\u9898\u5206\u6790\u4e0d\u662f\u7b80\u5355\u7684\u770b\u67d0\u6761\u8017\u65f6\u6570\u636e\u5c31\u53ef\u4ee5\u8fdb\u884c\u51c6\u786e\u7684\u5206\u6790\uff0c\u8fd9\u4e9b\u6570\u636e\u901a\u5e38\u53ea\u662f\u7ed9\u4e00\u4e2a\u6307\u793a\uff0c\u7528\u4e8e\u5224\u65ad\u6027\u80fd\u5206\u6790\u7684\u57fa\u672c\u65b9\u5411\uff0c\u7136\u540e\u7ed3\u5408\u65b9\u5411\uff0c\u6536\u96c6\u66f4\u591a\u7684\u4fe1\u606f\u53bb\u5370\u8bc1\u3002 \u6027\u80fd\u95ee\u9898\u4e00\u822c\u4ee5\u8d85\u65f6\u7684\u65b9\u5f0f\u8868\u73b0\u51fa\u6765\uff0c\u5f53\u51fa\u73b0\u6027\u80fd\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5efa\u8bae\u6536\u96c6\u5982\u4e0b\u65e5\u5fd7\uff1a</p> <ol> <li>consumer\u8c03\u7528\u51fa\u9519\u65e5\u5fd7\uff08\u5982\u679c\u6709\u7684\u8bdd\uff0c\u6bd4\u5982\u8d85\u65f6\uff09\uff1b</li> <li>provider\u8c03\u7528\u51fa\u9519\u65e5\u5fd7\uff08\u5982\u679c\u6709\u7684\u8bdd\uff0c\u6bd4\u5982\u4e22\u5f03\u8bf7\u6c42\uff09\uff1b</li> <li>consumer\u5bf9\u5e94\u65f6\u95f4\u6bb5\u7684metrics\u65e5\u5fd7\uff0c\u5305\u62ec\u5468\u671f\u7edf\u8ba1\u6570\u636e\u548c\u6162\u8c03\u7528\u65e5\u5fd7\uff1b</li> <li>provider\u5bf9\u5e94\u65f6\u95f4\u6bb5\u7684metrics\u65e5\u5fd7\uff0c\u5305\u62ec\u5468\u671f\u7edf\u8ba1\u6570\u636e\u548c\u6162\u8c03\u7528\u65e5\u5fd7\uff1b</li> </ol> <p>\u901a\u5e38\u7ed3\u5408\u4e0a\u9762\u7684\u65e5\u5fd7\uff0c\u5c31\u80fd\u591f\u521d\u6b65\u8bc6\u522b\u51fa\u6027\u80fd\u74f6\u9888\u7684\u4f4d\u7f6e\u4e86\u3002metrics\u65e5\u5fd7\u91cd\u70b9\u53cd\u6620\u7684\u662fJava Chassis\u5404\u4e2a\u5904\u7406\u73af\u8282\u7684\u8017\u65f6\uff0c \u5bf9\u4e8e\u7ebf\u7a0b\u6392\u961f\u7684\u573a\u666f\uff0c\u9700\u8981\u8fdb\u4e00\u6b65\u8bc6\u522b\u4e1a\u52a1\u7684\u6027\u80fd\u74f6\u9888\uff1a</p> <ol> <li>\u901a\u8fc7 <code>jstack</code> \u91c7\u96c6\u5806\u6808\u4fe1\u606f\u3002\u8fd9\u4e2a\u901a\u5e38\u6bd4\u8f83\u96be\u4e8e\u6536\u96c6\uff0c\u9700\u8981\u5728\u51fa\u73b0\u6027\u80fd\u7f13\u6162\u7684\u65f6\u523b\uff0c\u6293\u53d6\u3002\u5efa\u8bae\u6bcf\u9694\u51e0\u79d2\u949f\uff0c\u8fde\u7eed\u6293\u53d63\u4e2a\u4ee5\u4e0a\u5806\u6808\uff0c\u7528\u4e8e\u5206\u6790\u3002</li> <li>\u5bf9\u4e8e\u6d89\u53ca\u5185\u5b58\u7ba1\u7406\u548c\u5783\u573e\u56de\u6536\u7684\u95ee\u9898\uff0c\u9700\u8981\u6536\u96c6GC\u7684\u4fe1\u606f\uff0c\u548c\u5185\u5b58\u589e\u957f\u8d8b\u52bf\u3002 </li> </ol> <p>\u6536\u96c6\u6027\u80fd\u6570\u636e\u662f\u5206\u6790\u7684\u7b2c\u4e00\u6b65\uff0c\u7406\u89e3\u6027\u80fd\u6570\u636e\u9700\u8981\u719f\u6089Java Chassis\u7684\u5904\u7406\u8fc7\u7a0b\u3001\u7ebf\u7a0b\u6c60\u6392\u961f\u548c\u6267\u884c\u539f\u7406\u3001JVM\u7ebf\u7a0b\u5806\u6808\u548cGC\u673a\u5236\u7b49\uff0c\u8fd9\u91cc\u4e0d\u8be6\u7ec6 \u63cf\u8ff0\uff0c\u7ed3\u5408\u5b9e\u9645\u95ee\u9898\u5728\u8fc7\u7a0b\u4e2d\u5b66\u4e60\u662f\u66f4\u597d\u7684\u63d0\u5347\u65b9\u5f0f\u3002 Java Chassis\u4e2d\u901a\u8fc7performance\u6807\u7b7e\u7684\u95ee\u9898\u548c\u6027\u80fd\u6709\u5173\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u4e1a\u52a1\u6027\u80fd\u95ee\u9898 \u5206\u6790\u7684\u53c2\u8003\uff0c\u78b0\u5230\u6027\u80fd\u95ee\u9898\uff0c\u4e5f\u53ef\u4ee5\u63d0\u4ea4issue\uff0c\u627e\u793e\u533a\u5bfb\u6c42\u5e2e\u52a9\uff0c\u8bb0\u5f97\u5728issue\u4e2d\u5305\u542bmetrics\u4fe1\u606f\u3002 </p>"},{"location":"featured-topics/performance.html#_7","title":"\u6027\u80fd\u5e38\u8bc6","text":"<p>\u4e0b\u9762\u63d0\u4f9b\u4e00\u4e9b\u5e38\u89c1\u7684\u6570\u636e\uff0c\u5e2e\u52a9\u8bc6\u522b\u6027\u80fd\u74f6\u9888\u3002\u8fd9\u4e9b\u6570\u636e\u5e76\u4e0d\u662f\u7406\u8bba\u4e0a\u7cbe\u786e\u7684\uff0c\u4ec5\u4f9b\u53c2\u8003\u3002 </p> <ul> <li>\u901a\u8fc7\u4e00\u6b21\u8c03\u7528\uff0c\u53ef\u4ee5\u6536\u96c6\u5230\u4e00\u4e2a\u8bf7\u6c42\u53d1\u51fa\u5230\u6536\u5230\u54cd\u5e94\u7684\u65f6\u5ef6\uff0c\u8fd9\u4e2a\u65f6\u5ef6\u79f0\u4e3a\u5e73\u5747\u65f6\u5ef6\u3002\u5e76\u53d1\u573a\u666f\uff0c\u5e73\u5747\u65f6\u5ef6\u5e76\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u901a\u5e38\u968f\u7740\u5e76\u53d1\u6570 \u589e\u5927\u800c\u589e\u5927\u3002</li> <li>\u4e00\u4e2a\u8bf7\u6c42\u7684\u5e73\u5747\u65f6\u5ef6\u57280.1ms~1ms\u4e4b\u95f4\uff0cTPS\u53ef\u4ee5\u8fbe\u52301\u4e07~10\u4e07\u3002 0.1ms\u7684\u65f6\u5ef6\uff0c\u662f\u4e0d\u5e26\u4efb\u4f55\u4e1a\u52a1\u903b\u8f91\u7684\u5f00\u53d1\u6846\u67b6\u65f6\u5ef6\uff0c\u5f53\u5e73\u5747\u65f6\u5ef6 \u5c0f\u4e8e1ms\u7684\u60c5\u51b5\uff0c\u8fdb\u4e00\u6b65\u63d0\u5347\u6027\u80fd\uff0c\u9700\u8981\u8003\u8651\u6846\u67b6\u6027\u80fd\u8c03\u4f18\uff0c\u8fd8\u4f1a\u6d89\u53ca\u64cd\u4f5c\u7cfb\u7edf\u3001\u7f51\u7edc\u7b49\u8c03\u4f18\uff0c\u6bd4\u8f83\u590d\u6742\uff1b\u5927\u4e8e1ms\u7684\u60c5\u51b5\uff0c\u901a\u5e38\u90fd\u9700\u8981 \u8c03\u4f18\u4e1a\u52a1\u4ee3\u7801\uff0c\u6846\u67b6\u4e0d\u662f\u6027\u80fd\u74f6\u9888\u3002</li> <li>\u4e00\u4e2a\u8bf7\u6c42\u7684\u5e73\u5747\u65f6\u5ef6\u57281ms~10ms\u4e4b\u95f4\uff0cTPS\u53ef\u4ee5\u8fbe\u52301\u5343~1\u4e07\u3002</li> <li>\u4e00\u4e2a\u8bf7\u6c42\u7684\u5e73\u5747\u65f6\u5ef6\u572810ms~100ms\u4e4b\u95f4\uff0cTPS\u53ef\u4ee5\u8fbe\u52301\u767e~1\u5343\u3002</li> <li>\u6709\u4e2a\u7b80\u5355\u7684\u516c\u5f0f\uff0c\u53ef\u4ee5\u4f30\u7b97\u6700\u5927TPS\uff1a <code>CPU\u6838\u6570 * (1000/\u5e73\u5747\u65f6\u5ef6)</code> &lt; TPS &lt; <code>\u7ebf\u7a0b\u6570 * (1000/\u5e73\u5747\u65f6\u5ef6)</code>\u3002 \u8d8a\u662f\u8ba1\u7b97\u5bc6\u96c6\u578b\u7684 \u4efb\u52a1\uff0cTPS\u8d8a\u63a5\u8fd1<code>CPU\u6838\u6570 * (1000/\u5e73\u5747\u65f6\u5ef6)</code>\uff1b\u7a7a\u95f2\u7b49\u5f85\u4efb\u52a1\u8d8a\u591a\uff0c\u8d8a\u662f\u63a5\u8fd1<code>\u7ebf\u7a0b\u6570 * (1000/\u5e73\u5747\u65f6\u5ef6)</code>\u3002 \u538b\u6d4b\u7684\u65f6\u5019\uff0c\u5982\u679c\u5e76\u53d1 \u8bf7\u6c42\u5927\u4e8e\u4e0a\u8ff0\u4f30\u7b97\u503c\uff0c\u90a3\u4e48\u5c31\u4f1a\u51fa\u73b0\u5927\u91cf\u8bf7\u6c42\u8d85\u65f6\u3002 </li> </ul>"},{"location":"featured-topics/secrets.html","title":"\u6280\u672f\u89e3\u5bc6","text":"<ul> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u8d1f\u8f7d\u5747\u8861\u9009\u62e9\u5668</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u591a\u79cd\u5e8f\u5217\u5316\u65b9\u5f0f\u652f\u6301</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u7194\u65ad\u673a\u5236\u7684\u6539\u8fdb\u8def\u7a0b</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u8fc7\u8f7d\u72b6\u6001\u4e0b\u7684\u5feb\u901f\u5931\u8d25</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u5e94\u7528\u89c6\u89d2\u7684\u914d\u7f6e\u7ba1\u7406</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6613\u6269\u5c55\u7684\u591a\u79cd\u6ce8\u518c\u4e2d\u5fc3\u652f\u6301</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u4e0eSpring Cloud\u7684\u4e92\u64cd\u4f5c</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1aZooKeeper\u6ce8\u518c\u548c\u914d\u7f6e\u4e2d\u5fc3</li> <li>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u5951\u7ea6\u4f18\u5148\uff08API First\uff09\u5f00\u53d1</li> </ul>"},{"location":"featured-topics/upgrading.html","title":"\u5347\u7ea7\u6307\u5bfc","text":"<ul> <li>2.8.x \u5347\u7ea7 3.0.0\u6307\u5bfc</li> </ul>"},{"location":"featured-topics/application-bmi/flow-control.html","title":"\u6d41\u91cf\u63a7\u5236","text":"<p>\u6d41\u91cf\u63a7\u5236\u673a\u5236\u901a\u8fc7\u63a7\u5236\u6570\u636e\u4f20\u8f93\u901f\u7387\u6765\u907f\u514d\u5fae\u670d\u52a1\u8fc7\u8f7d\u8fd0\u884c\u3002\u672c\u6307\u5357\u5c06\u5c55\u793a\u5982\u4f55\u5728 \u4f53\u8d28\u6307\u6570 \u5e94\u7528\u4e2d\u4f7f\u7528\u6d41\u91cf\u63a7\u5236\u80fd\u529b\u3002</p>"},{"location":"featured-topics/application-bmi/flow-control.html#_2","title":"\u524d\u8a00","text":"<p>\u5728\u60a8\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u9605\u8bfb\u4e86\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1\uff0c\u5e76\u5df2\u6210\u529f\u8fd0\u884c\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u3002</p>"},{"location":"featured-topics/application-bmi/flow-control.html#_3","title":"\u5f00\u542f","text":"<ul> <li>\u5728 \u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668 \u7684 <code>application.yml</code> \u6587\u4ef6\u4e2d\u6307\u660e\u6d41\u63a7\u7b56\u7565\uff1a</li> </ul> <pre><code>servicecomb:\n matchGroup:\n bmi-operation: |\n matches:\n - apiPath:\n exact: \"/bmi\"\n rateLimiting:\n bmi-operation: |\n timeoutDuration: 0\n limitRefreshPeriod: 1000\n rate: 1\n</code></pre>"},{"location":"featured-topics/application-bmi/flow-control.html#_4","title":"\u9a8c\u8bc1","text":"<p>\u8bbf\u95ee http://localhost:8889\uff0c\u5728\u8eab\u9ad8\u548c\u4f53\u91cd\u7684\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u6b63\u6570\uff0c\u5c1d\u8bd5\u57281\u79d2\u5185\u591a\u6b21\u70b9\u51fb Submit \u6309\u94ae\uff0c\u6b64\u65f6\u5c31\u80fd\u770b\u5230\u7f51\u9875\u7531\u5de6\u4fa7\u7684\u6b63\u5e38\u7684\u754c\u9762\u53d8\u6210\u4e86\u53f3\u4fa7\u63d0\u793a\u7531\u4e8e\u6d41\u63a7\u53d7\u9650\u800c\u8bf7\u6c42\u88ab\u62d2\u7684\u754c\u9762\u3002</p> <p></p>"},{"location":"featured-topics/application-bmi/gray-release.html","title":"\u7070\u5ea6\u53d1\u5e03","text":"<p>\u7070\u5ea6\u53d1\u5e03\u5b58\u5728\u5f88\u591a\u4e0d\u540c\u7684\u5e94\u7528\u573a\u666f\uff0c\u5305\u62ec\u89e3\u51b3\u7248\u672c\u517c\u5bb9\u6027\u95ee\u9898\u3001A/B Test\u3001\u5e73\u6ed1\u5347\u7ea7\u7b49\u3002\u672c\u6307\u5357\u5c06\u5c55\u793a\u5982\u4f55\u5728 \u4f53\u8d28\u6307\u6570 \u5e94\u7528\u4e2d\u4f7f\u7528\u7070\u5ea6\u53d1\u5e03\u80fd\u529b\u3002</p>"},{"location":"featured-topics/application-bmi/gray-release.html#_2","title":"\u524d\u8a00","text":"<p>\u5728\u60a8\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u9605\u8bfb\u4e86\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1\uff0c\u5e76\u5df2\u6210\u529f\u8fd0\u884c\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u3002</p>"},{"location":"featured-topics/application-bmi/gray-release.html#_3","title":"\u542f\u7528","text":"<ul> <li>\u9996\u5148\u9700\u8981\u8fdb\u884c\u7070\u5ea6\u53d1\u5e03\u7b56\u7565\u8bbe\u8ba1\u3002 \u5728\u8fd9\u4e2a\u5b9e\u4f8b\u4e2d\uff0c\u5c06\u4f53\u91cd &gt;= 60 \u7684\u8bf7\u6c42\u8f6c\u53d1\u5230 0.0.2 \u7248\u672c\uff0c \u5c06\u4f53\u91cd &lt;60 \u7684\u8bf7\u6c42\u8f6c\u53d1\u5230 0.0.1 \u7248\u672c\u3002 \u7070\u5ea6\u53d1\u5e03\u7b56\u7565\u4e00\u822c\u4f7f\u7528\u8bf7\u6c42\u5934\u8fdb\u884c\u6807\u8bb0\uff0c \u4e3a\u4e86\u5b9e\u73b0\u8fd9\u4e2a\u76ee\u7684\uff0c\u4f7f\u7528 Java Chassis\u7684Context Mapper\u673a\u5236\uff0c\u5c06\u7b26\u5408\u8bf7\u6c42\u7279\u5f81\u7684\u8bf7\u6c42\u8bbe\u7f6e\u4e0d\u4e00\u6837\u7684 header\u3002 \u4e0b\u9762\u7684\u914d\u7f6e\u4f1a\u6839\u636e\u8bf7\u6c42\u7279\u6027\uff0c\u8bbe\u7f6e x-gray = 1\uff0c \u6216\u8005 x-gray= 0 \u3002 </li> </ul> <p>\u6ce8\u610f\uff1a\u6d41\u91cf\u7279\u5f81\u6cbb\u7406\u7684\u5339\u914d\u89c4\u5219\u90fd\u662f String - String \u7684\u952e\u503c\u5bf9\u3002\u4f7f\u7528 yaml \u6587\u4ef6\u914d\u7f6e\u7684\u65f6\u5019\uff0c\u5982\u679c\u6d89\u53ca\u6570\u5b57\u548c\u7279\u6b8a\u5b57\u7b26\uff0c\u9700\u8981\u4f7f\u7528\u5f15\u53f7\uff0c\u5426\u5219\u4f1a\u89e3\u6790\u4e3a\u5176\u4ed6\u7c7b\u578b\u51fa\u73b0\u9519\u8bef\u3002</p> <pre><code>servicecomb:\n matchGroup:\n bmi-operation: |\n matches:\n - apiPath:\n exact: \"/bmi\"\n bmi-operation-heavy: |\n matches:\n - apiPath:\n exact: \"/bmi\"\n queries:\n weight:\n compare: \"&gt;=60\"\n bmi-operation-thin: |\n matches:\n - apiPath:\n exact: \"/bmi\"\n queries:\n weight:\n compare: \"&lt;60\"\n mapper:\n bmi-operation-heavy: |\n target:\n x-gray: \"1\"\n bmi-operation-thin: |\n target:\n x-gray: \"0\"\n</code></pre> <ul> <li>\u5728 \u4f53\u8d28\u6307\u6570\u754c\u9762 \u7684 <code>application.yml</code> \u6587\u4ef6\u4e2d\u6dfb\u52a0\u7070\u5ea6\u53d1\u5e03\u7b56\u7565\uff1a</li> </ul> <pre><code>servicecomb:\n router:\n type: router\n globalRouteRule: |\n - precedence: 2\n match:\n headers:\n x-gray: \n exact: \"1\"\n route:\n - weight: 100\n tags:\n version: 0.0.2\n - precedence: 1\n match:\n headers:\n x-gray: \n exact: \"0\"\n route:\n - weight: 100\n tags:\n version: 0.0.1\n</code></pre> <p>\u6ce8\u610f\uff1a\u8def\u7531\u63a7\u5236\u662f\u5728\u6d88\u8d39\u8005\u65b9\u3002</p>"},{"location":"featured-topics/application-bmi/gray-release.html#_4","title":"\u9a8c\u8bc1","text":"<p>\u5bf9 \u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668 \u5fae\u670d\u52a1\u8fdb\u884c\u6c34\u5e73\u6269\u5c55\uff0c\u4f7f\u5176\u8fd0\u884c\u5b9e\u4f8b\u6570\u4e3a2\uff0c\u5373\u65b0\u589e\u4e00\u4e2a\u8fd0\u884c\u5b9e\u4f8b\u3002 \u8be5\u5b9e\u4f8b\u7684\u7248\u672c\u53f7\u662f 0.0.2. </p> <pre><code>mvn spring-boot:run -Dspring-boot.run.jvmArguments=\"-Dservicecomb.rest.address=0.0.0.0:7779 -Dservicecomb.service.version=0.0.2\"\n</code></pre> <ul> <li> <p>\u8bbf\u95ee http://localhost:8889 \uff0c\u5728\u8eab\u9ad8\u548c\u4f53\u91cd\u680f\u5904\u8f93\u5165\u6b63\u6570\uff0c\u5e76\u70b9\u51fb Submit \u6309\u94ae\u3002</p> </li> <li> <p>\u5982\u679c\u4f53\u91cd\u5927\u4e8e\u7b49\u4e8e60\uff0c \u8bf7\u6c42\u59cb\u7ec8\u8f6c\u53d1\u5230\u4e00\u4e2a0.0.2\u7248\u672c\u5b9e\u4f8b\uff1b\u4f53\u91cd\u5c0f\u4e8e60\uff0c \u8bf7\u6c42\u4f1a\u8f6c\u53d1\u52300.0.1\u7248\u672c\u7684\u5b9e\u4f8b\u3002 </p> </li> </ul> <p></p>"},{"location":"featured-topics/application-bmi/load-balance.html","title":"\u8d1f\u8f7d\u5747\u8861","text":"<p>\u5f53\u5bf9\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\u8fdb\u884c\u6c34\u5e73\u6269\u5c55\u65f6\uff0c\u9700\u8981\u5c06\u8bf7\u6c42\u5747\u8861\u5730\u5206\u53d1\u5230\u591a\u4e2a\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\u4e0a\u3002\u672c\u6307\u5357\u5c06\u5c55\u793a\u5982\u4f55\u5728 \u4f53\u8d28\u6307\u6570 \u5e94\u7528\u4e2d\u4f7f\u7528 ServiceComb \u63d0\u4f9b\u7684\u8d1f\u8f7d\u5747\u8861\u80fd\u529b\u3002</p>"},{"location":"featured-topics/application-bmi/load-balance.html#_2","title":"\u524d\u8a00","text":"<p>\u5728\u60a8\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u9605\u8bfb\u4e86\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1\uff0c\u5e76\u5df2\u6210\u529f\u8fd0\u884c\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u3002</p>"},{"location":"featured-topics/application-bmi/load-balance.html#_3","title":"\u5f00\u542f","text":"<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u4f7f\u7528\u5185\u7f6e\u7684\u4e00\u4e2a\u7b80\u5355\u7684\u8d1f\u8f7d\u5747\u8861\u7684\u5b9e\u73b0\uff0c\u4e0d\u9700\u8981\u989d\u5916\u7684\u914d\u7f6e\u3002</p>"},{"location":"featured-topics/application-bmi/load-balance.html#_4","title":"\u9a8c\u8bc1","text":"<p>\u5bf9 \u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668 \u5fae\u670d\u52a1\u8fdb\u884c\u6c34\u5e73\u6269\u5c55\uff0c\u4f7f\u5176\u8fd0\u884c\u5b9e\u4f8b\u6570\u4e3a2\uff0c\u5373\u65b0\u589e\u4e00\u4e2a\u8fd0\u884c\u5b9e\u4f8b\uff1a</p> <pre><code>mvn spring-boot:run -Dspring-boot.run.jvmArguments=\"-Dservicecomb.rest.address=0.0.0.0:7779\"\n</code></pre> <p>\u4e3a\u4e86\u4fbf\u4e8e\u533a\u5206\u4e0d\u540c\u7684\u8fd0\u884c\u5b9e\u4f8b\uff0c\u5728\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\u7684\u5b9e\u73b0\u4e2d\u65b0\u589e\u4e86\u8fd4\u56de\u5b9e\u4f8bID\u548c\u8fd0\u884c\u65f6\u95f4\u7684\u63a5\u53e3\u3002\u800c\u4e3a\u4e86\u907f\u514d\u7aef\u53e3\u51b2\u7a81\uff0c\u65b0\u7684\u5b9e\u4f8b\u5728\u53e6\u4e00\u4e2a\u7aef\u53e3\u4e0a\u8fd0\u884c\u3002</p> <p>\u6b64\u65f6\u70b9\u51fb Submit \u6309\u94ae\u5c31\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4e24\u4e2a\u754c\u9762\u4e2d\u7684\u5b9e\u4f8bID\u4ea4\u66ff\u51fa\u73b0\u3002</p> <p></p>"},{"location":"featured-topics/application-bmi/quick-start-advance.html","title":"\u5fae\u670d\u52a1\u5f00\u53d1\u8fdb\u9636","text":"<p>\u672c\u6307\u5357\u5c06\u5e26\u60a8\u8fdb\u5165\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1\u7684\u8fdb\u9636\u4e4b\u65c5\u3002\u5728\u6b64\u65c5\u7a0b\uff0c\u60a8\u5c06\u80fd\u5b66\u5230 ServiceComb \u6846\u67b6\u5982\u4f55\u901a\u8fc7\u5904\u7406\u94fe\u4fdd\u8bc1\u5fae\u670d\u52a1\u7684\u53ef\u9760\u6027\uff1a</p> <ul> <li> <p>\u8d1f\u8f7d\u5747\u8861\u3002\u5747\u8861\u5730\u5c06\u8bf7\u6c42\u5206\u53d1\u81f3\u591a\u4e2a\u670d\u52a1\u5b9e\u4f8b\u4e2d\u5904\u7406\u3002</p> </li> <li> <p>\u6d41\u91cf\u63a7\u5236\u3002\u9650\u5236\u5355\u4f4d\u65f6\u95f4\u5185\u8bbf\u95ee\u67d0\u4e2a\u5fae\u670d\u52a1\u7684\u8bf7\u6c42\u6570\u91cf\u3002</p> </li> <li> <p>\u7194\u65ad\u63a7\u5236\u3002\u5728\u5fae\u670d\u52a1\u5e94\u7528\u4e2d\u9694\u79bb\u5f02\u5e38\u670d\u52a1\u5e76\u963b\u6b62\u5f02\u5e38\u4f20\u9012\u3002</p> </li> <li> <p>\u7070\u5ea6\u53d1\u5e03\u3002\u5bf9\u5fae\u670d\u52a1\u8fdb\u884c\u591a\u7248\u672c\u53d1\u5e03\u3002</p> </li> </ul>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html","title":"\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1","text":"<p>\u5728\u60a8\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u9605\u8bfb\u4e86\u5feb\u901f\u5165\u95e8\uff0c\u5e76\u5df2\u6210\u529f\u8fd0\u884c\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u3002\u63a5\u4e0b\u6765\u5c06\u8fdb\u5165\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u7684\u5f00\u53d1\u4e4b\u65c5\u3002</p>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_2","title":"\u5feb\u901f\u5f00\u53d1\u5fae\u670d\u52a1\u5e94\u7528","text":"<p>BMI\u4e3b\u8981\u7531\u4e24\u4e2a\u5fae\u670d\u52a1\u7ec4\u6210\uff1a</p> <ul> <li> <p>\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\uff1a\u8d1f\u8d23\u5904\u7406\u8fd0\u7b97\u4e8b\u52a1\u3002</p> </li> <li> <p>\u4f53\u8d28\u6307\u6570\u754c\u9762\uff1a\u63d0\u4f9b\u7528\u6237\u754c\u9762\u53ca\u7f51\u5173\u670d\u52a1\u3002</p> </li> </ul> <p>\u5728\u5f00\u59cb\u524d\uff0c\u9700\u8981\u5148\u5728\u670d\u52a1\u7684\u7236\u5de5\u7a0b\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u4f9d\u8d56\u9879\uff1a</p> <pre><code>\n&lt;dependencyManagement&gt;\n &lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-dependencies&lt;/artifactId&gt;\n &lt;version&gt;${servicecomb.version}&lt;/version&gt;\n &lt;type&gt;pom&lt;/type&gt;\n &lt;scope&gt;import&lt;/scope&gt;\n &lt;/dependency&gt;\n &lt;/dependencies&gt;\n&lt;/dependencyManagement&gt;\n</code></pre> <p>\u6ce8\u610f: <code>java-chassis-dependencies</code> \u8fd9\u4e2a\u4f9d\u8d56\u662f\u4ee5pom\u7684\u5f62\u5f0f\u5bfc\u5165\u6765\u7edf\u4e00\u9879\u76ee\u4e2d\u7684\u4f9d\u8d56\u9879\u7684\u7248\u672c\u7ba1\u7406\u3002</p> <p>\u4e0b\u9762\u5c06\u5bf9\u8fd9\u4e24\u4e2a\u5fae\u670d\u52a1\u7684\u5b9e\u73b0\u8fdb\u884c\u4ecb\u7ecd\uff0c\u5176\u4ee3\u7801\u5df2\u6258\u7ba1\u4e8egithub\u4e0a\u3002</p>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_3","title":"\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\u5b9e\u73b0","text":"<p>\u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668\u63d0\u4f9b\u8fd0\u7b97\u670d\u52a1\uff0c\u5176\u5b9e\u73b0\u5206\u4e3a\u4e09\u90e8\u5206\uff1a</p> <ul> <li> <p>\u5177\u4f53\u8fd0\u7b97\u5b9e\u73b0</p> </li> <li> <p>\u670d\u52a1\u7aef\u70b9\u5b9a\u4e49</p> </li> <li> <p>\u670d\u52a1\u542f\u52a8\u5165\u53e3</p> </li> </ul>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_4","title":"\u5177\u4f53\u8fd0\u7b97\u5b9e\u73b0","text":"<p>\u672c\u6a21\u5757\u8d1f\u8d23\u8ba1\u7b97\u4f53\u8d28\u6307\u6570\uff0c\u6839\u636e\u516c\u5f0f <code>\u4f53\u8d28\u6307\u6570=\u4f53\u91cd / \u8eab\u9ad8^2</code> \u8fdb\u884c\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>public interface CalculatorService {\n double calculate(double height, double weight);\n}\n\n@Service\npublic class CalculatorServiceImpl implements CalculatorService {\n @Override\n public double calculate(double height, double weight) {\n if (height &lt;= 0 || weight &lt;= 0) {\n throw new IllegalArgumentException(\"Arguments must be above 0\");\n }\n double heightInMeter = height / 100;\n return weight / (heightInMeter * heightInMeter);\n }\n}\n</code></pre>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_5","title":"\u670d\u52a1\u7aef\u70b9\u5b9a\u4e49","text":"<p>\u670d\u52a1\u7aef\u70b9\u7528\u4e8e\u751f\u6210\u670d\u52a1\u5951\u7ea6\uff0c\u4f7f\u5f97\u670d\u52a1\u95f4\u80fd\u65e0\u7f1d\u8fdb\u884c\u901a\u4fe1\u3002\u9996\u5148\u5b9a\u4e49\u7aef\u70b9\u63a5\u53e3\uff1a</p> <pre><code>public interface CalculatorEndpoint {\n double calculate(double height, double weight);\n}\n</code></pre> <p>\u5f15\u5165 ServiceComb \u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-service-center&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-standalone&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;solution-basic&lt;/artifactId&gt;\n &lt;/dependency&gt;\n&lt;/dependencies&gt;\n</code></pre> <p>\u66b4\u9732\u8fd0\u7b97\u670d\u52a1\u7684Restful\u7aef\u70b9\uff1a</p> <pre><code>@RestSchema(schemaId = \"calculatorRestEndpoint\")\n@RequestMapping(\"/\")\npublic class CalculatorRestEndpoint implements CalculatorEndpoint {\n\n private final CalculatorService calculatorService;\n\n @Autowired\n public CalculatorRestEndpoint(CalculatorService calculatorService) {\n this.calculatorService = calculatorService;\n }\n\n @Override\n @GetMapping(\"/bmi\")\n public double calculate(double height, double weight) {\n return calculatorService.calculate(height, weight);\n }\n}\n</code></pre> <p>\u8fd9\u91cc\u7528<code>@RestSchema</code>\u6ce8\u91ca\u7aef\u70b9\u540e\uff0c ServiceComb \u5fae\u670d\u52a1\u6846\u67b6\u4f1a\u81ea\u52a8\u751f\u6210\u5bf9\u5e94\u7684\u670d\u52a1\u7aef\u70b9\u5951\u7ea6\uff0c\u5e76\u6839\u636e \u5982\u4e0b\u7684 <code>application.yml</code> \u6587\u4ef6\u4e2d\u7684\u5b9a\u4e49\u6765\u914d\u7f6e\u7aef\u70b9\u7aef\u53e3\uff0c\u5c06\u5951\u7ea6\u548c\u670d\u52a1\u4e00\u8d77\u6ce8\u518c\u5230\u670d\u52a1\u6ce8\u518c\u4e2d\u5fc3\u3002</p> <pre><code>servicecomb:\n registry:\n sc:\n address: http://127.0.0.1:30100\n service:\n application: bmi\n name: calculator\n version: 0.0.1\n\n rest:\n address: 0.0.0.0:7777\n</code></pre>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_6","title":"\u670d\u52a1\u542f\u52a8\u5165\u53e3","text":"<p>\u670d\u52a1\u542f\u52a8\u5165\u53e3\u6309\u7167\u9ad8\u6027\u80fd\u6a21\u5f0f \u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>@SpringBootApplication\npublic class CalculatorApplication {\n public static void main(String[] args) {\n try {\n new SpringApplicationBuilder().web(WebApplicationType.NONE).sources(CalculatorApplication.class).run(args);\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}\n\n</code></pre>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_7","title":"\u4f53\u8d28\u6307\u6570\u754c\u9762\u5b9e\u73b0","text":"<p>\u672c\u6a21\u5757\u8d1f\u8d23\u63d0\u4f9b\u7528\u6237\u754c\u9762\u53ca\u7f51\u5173\u670d\u52a1\u3002\u5176\u5b9e\u73b0\u4e3b\u8981\u5206\u4e3a\u4e09\u90e8\u5206\uff1a</p> <ul> <li> <p>\u524d\u7aef\u754c\u9762</p> </li> <li> <p>\u7f51\u5173\u53ca\u8def\u7531\u89c4\u5219</p> </li> <li> <p>\u670d\u52a1\u542f\u52a8\u5165\u53e3</p> </li> </ul> <p>\u5176\u4e2d\uff0c\u524d\u7aef\u754c\u9762\u7684\u7ec4\u4ef6\u4f7f\u7528\u4e86Bootstrap\u6765\u5f00\u53d1\u3002</p>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_8","title":"\u7f51\u5173\u53ca\u8def\u7531\u89c4\u5219","text":"<p>\u7f51\u5173\u670d\u52a1\u4f7f\u7528 ServiceComb \u63d0\u4f9b\u7684 Edge Service \u6765\u5b9e\u73b0\u3002</p> <p>\u5f15\u5165\u4f9d\u8d56\uff1a</p> <pre><code>\n&lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-service-center&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-standalone&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;solution-basic&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;edge-core&lt;/artifactId&gt;\n &lt;/dependency&gt;\n&lt;/dependencies&gt;\n</code></pre> <p>\u5728 <code>application.yml</code> \u6587\u4ef6\u4e2d\u914d\u7f6e\u8def\u7531\u89c4\u5219\u53ca\u670d\u52a1\u7aef\u53e3\u4fe1\u606f\uff1a</p> <pre><code>servicecomb:\n registry:\n sc:\n address: http://127.0.0.1:30100\n service:\n application: bmi\n name: gateway\n version: 0.0.1\n\n rest:\n address: 0.0.0.0:8889\n\n tracing:\n enabled: false\n\n http:\n dispatcher:\n edge:\n default:\n enabled: false\n prefix: api\n withVersion: false\n prefixSegmentCount: 1\n url:\n enabled: true\n mappings:\n calculator:\n prefixSegmentCount: 1\n path: \"/calculator/.*\"\n microserviceName: calculator\n versionRule: 0.0.0+\n\n# This is web root for windows server, change this path according to where you put your source code\ngateway:\n webroot: /code/servicecomb-samples/java-chassis-samples/bmi/webapp/src/main/resources/static\n</code></pre> <p>\u5176\u4e2d <code>servicecomb.http.dispatcher.edge.default.enabled</code> \u7981\u7528\u4e86\u9ed8\u8ba4\u7684\u8def\u7531\u89c4\u5219\uff0c <code>servicecomb.http.dispatcher.edge.url.enabled</code> \u542f\u7528\u4e86\u57fa\u4e8eURL\u6620\u5c04\u7684\u8def\u7531\u89c4\u5219\u3002 \u89c4\u5219\u7684\u542b\u4e49\u8868\u793a\u5c06URL\u4e3a <code>/calculator/.*</code> \u7684\u8bf7\u6c42\u8f6c\u53d1\u5230 <code>calculator</code>\u670d\u52a1\u3002</p> <p><code>gateway.webroot</code> \u914d\u7f6e\u4e86\u9759\u6001\u9875\u9762\u6240\u5728\u7684\u76ee\u5f55\u4f4d\u7f6e\u3002 \u793a\u4f8b\u91cc\u9762\u91c7\u7528\u7684\u662f Windows \u76ee\u5f55\u73af\u5883\uff0c\u5982\u679c\u91c7\u7528 Linux \u73af\u5883\uff0c\u9700\u8981\u914d\u7f6e\u76f8\u5bf9\u8def\u5f84\u3002</p> <p><code>StaticWebpageDispatcher</code> \u6269\u5c55\u4e86 Edge Service \u7684\u8f6c\u53d1\u89c4\u5219\uff0c \u4f7f\u7528\u4e86 vert.x \u63d0\u4f9b\u7684 <code>StaticHandler</code> \u53d1\u5e03\u9759\u6001\u9875\u9762\u3002 Edge Service \u91c7\u7528 SPI \u7684\u65b9\u5f0f\u6269\u5c55 Dispatcher\uff0c \u9700\u8981\u521b\u5efa\u6587\u4ef6 <code>org.apache.servicecomb.transport.rest.vertx.VertxHttpDispatcher</code>\u3002 </p>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_9","title":"\u670d\u52a1\u542f\u52a8\u5165\u53e3","text":"<p>\u670d\u52a1\u542f\u52a8\u5165\u53e3\u6309\u7167\u9ad8\u6027\u80fd\u6a21\u5f0f \u4ee3\u7801\u5982\u4e0b\uff1a</p> <pre><code>@SpringBootApplication\npublic class GatewayApplication {\n public static void main(String[] args) {\n new SpringApplicationBuilder().web(WebApplicationType.NONE).sources(GatewayApplication.class).run(args);\n }\n}\n</code></pre> <p>\u81f3\u6b64\uff0c\u4f53\u8d28\u6307\u6570\u5e94\u7528\u5df2\u5f00\u53d1\u5b8c\u6bd5\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u5feb\u901f\u5165\u95e8\u4e2d\u7684\u6b65\u9aa4\u5bf9\u5176\u8fdb\u884c\u9a8c\u8bc1\u3002</p>"},{"location":"featured-topics/application-bmi/quick-start-bmi.html#_10","title":"\u4e0b\u4e00\u6b65","text":"<ul> <li>\u9605\u8bfb \u5fae\u670d\u52a1\u5f00\u53d1\u8fdb\u9636</li> </ul>"},{"location":"featured-topics/application-bmi/quick-start.html","title":"\u5feb\u901f\u5165\u95e8","text":""},{"location":"featured-topics/application-bmi/quick-start.html#java","title":"\u5b89\u88c5 Java \u5f00\u53d1\u73af\u5883","text":"<ul> <li> <p>\u5b89\u88c5git\uff0c\u8be6\u60c5\u53ef\u53c2\u8003git\u5b89\u88c5\u6559\u7a0b \u3002</p> </li> <li> <p>\u5b89\u88c5JDK 17\uff0c\u8be6\u60c5\u53ef\u53c2\u8003JDK\u5b89\u88c5\u6559\u7a0b \u3002</p> </li> <li> <p>\u5b89\u88c5Maven 3.x\uff0c\u8be6\u60c5\u53ef\u53c2\u8003Maven\u5b89\u88c5\u6559\u7a0b \u3002</p> </li> <li> <p>\u4e0b\u8f7d BMI \u4f8b\u5b50</p> </li> </ul> <pre><code>git clone https://github.com/apache/servicecomb-samples.git\ncd servicecomb-samples/bmi\nmvn clean install\n</code></pre>"},{"location":"featured-topics/application-bmi/quick-start.html#service-center","title":"\u8fd0\u884c Service Center","text":"<p>\u5728 ServiceComb \u5fae\u670d\u52a1\u6846\u67b6\u4e2d\uff0cService Center \u63d0\u4f9b\u670d\u52a1\u6ce8\u518c\u53ca\u670d\u52a1\u53d1\u73b0\u529f\u80fd\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528 Docker \u8fd0\u884c\u3002 </p> <pre><code>docker pull servicecomb/service-center\ndocker run -d -p 30100:30100 servicecomb/service-center:latest\n</code></pre> <p>\u60a8\u53ef\u4ee5\u901a\u8fc7\u9605\u8bfb\u73af\u5883\u5b89\u88c5 \u83b7\u53d6\u5728\u672c\u5730\u4ee5\u4e8c\u8fdb\u5236\u65b9\u5f0f\u8fd0\u884cService Center\u7684\u65b9\u6cd5\u3002</p>"},{"location":"featured-topics/application-bmi/quick-start.html#_2","title":"\u8fd0\u884c\u5fae\u670d\u52a1\u5e94\u7528","text":"<ul> <li>\u8fdb\u5165 \u4f53\u8d28\u6307\u6570 \u5e94\u7528\u4ee3\u7801\u76ee\u5f55\u3002</li> </ul> <pre><code>cd servicecomb-samples/bmi\n</code></pre> <p>\u6ce8\u610f\uff1a\u5728windows\u5f00\u53d1\u73af\u5883\u4e0b\uff0cdocker\u662f\u5728\u865a\u62df\u673a\u4e2d\u542f\u52a8\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u6539\u5fae\u670d\u52a1\u7684 Service Center IP\u5730\u5740\u4e3a\u865a\u62df\u673aIP\u5730\u5740\u3002\u4fee\u65392\u4e2a\u914d\u7f6e\u6587\u4ef6[calculator|webapp]/src/main/resources/application.yml\uff0c\u5c06\u5176\u4e2dhttp://127.0.0.1:30100\u4fee\u6539\u4e3ahttp://192.168.99.100:30100\uff0c\u5176\u4e2d192.168.99.100\u662f\u865a\u62df\u673aIP\uff0c\u9700\u8981\u4e0e\u5f00\u53d1\u73af\u5883\u4e2d\u7684\u865a\u62df\u673aIP\u4fdd\u6301\u4e00\u81f4\u3002</p> <ul> <li>\u542f\u52a8 \u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668 \u548c \u4f53\u8d28\u6307\u6570\u754c\u9762 \u5fae\u670d\u52a1\uff0c\u5206\u522b\u6267\u884c\u4ee5\u4e0b\u6307\u4ee4\uff1a</li> </ul> <pre><code>cd calculator; mvn spring-boot:run\ncd webapp; mvn spring-boot:run\n</code></pre> <ul> <li>\u9a8c\u8bc1\u670d\u52a1\u3002\u5fae\u670d\u52a1\u542f\u52a8\u5b8c\u6bd5\u540e\uff0c\u5373\u53ef\u901a\u8fc7 http://localhost:8889 \u8bbf\u95ee \u4f53\u8d28\u6307\u6570 \u5e94\u7528\uff0c\u5c4a\u65f6\u5c06\u80fd\u770b\u5230\u5982\u4e0b\u754c\u9762\uff0c\u5e76\u53ef\u8f93\u5165\u60a8\u7684\u8eab\u9ad8\u548c\u4f53\u91cd\u4fe1\u606f\u9a8c\u8bc1\u670d\u52a1\u662f\u5426\u6b63\u5e38\u8fd0\u884c\u3002</li> </ul> <p></p>"},{"location":"featured-topics/application-bmi/service-management.html","title":"\u7194\u65ad\u63a7\u5236","text":"<p>\u7194\u65ad\u63a7\u5236\u4e3b\u8981\u7528\u4e8e\u89e3\u51b3\u6216\u7f13\u89e3\u670d\u52a1\u96ea\u5d29\u7684\u60c5\u51b5\uff0c\u5373\u4e2a\u522b\u5fae\u670d\u52a1\u8868\u73b0\u5f02\u5e38\u65f6\uff0c\u7cfb\u7edf\u80fd\u5bf9\u5176\u8fdb\u884c\u5bb9\u9519\u5904\u7406\u3002\u672c\u6307\u5357\u5c06\u4f1a\u5c55\u793a\u5982\u4f55\u5728 \u4f53\u8d28\u6307\u6570 \u5e94\u7528\u4e2d\u4f7f\u7528\u7194\u65ad\u63a7\u5236\u80fd\u529b\u3002</p>"},{"location":"featured-topics/application-bmi/service-management.html#_2","title":"\u524d\u8a00","text":"<p>\u5728\u60a8\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u9605\u8bfb\u4e86\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u5e94\u7528\u5f00\u53d1\uff0c\u5e76\u5df2\u6210\u529f\u8fd0\u884c\u4f53\u8d28\u6307\u6570\u5fae\u670d\u52a1\u3002</p>"},{"location":"featured-topics/application-bmi/service-management.html#_3","title":"\u542f\u7528","text":"<ul> <li>\u5728 \u4f53\u8d28\u6307\u6570\u754c\u9762 \u7684 <code>application.yml</code> \u6587\u4ef6\u4e2d\u6307\u660e\u4f7f\u7528\u670d\u52a1\u6cbb\u7406\u7684\u5904\u7406\u94fe\u53ca\u6307\u5b9a\u7194\u65ad\u548c\u5bb9\u9519\u7b56\u7565\uff1a</li> </ul> <pre><code>servicecomb:\n matchGroup:\n bmi-operation: |\n matches:\n - apiPath:\n exact: \"/bmi\"\n instanceIsolation:\n bmi-operation: |\n minimumNumberOfCalls: 5\n slidingWindowSize: 10\n slidingWindowType: COUNT_BASED\n failureRateThreshold: 50\n slowCallRateThreshold: 100\n slowCallDurationThreshold: 3000\n waitDurationInOpenState: 10000 \n permittedNumberOfCallsInHalfOpenState: 10\n\n</code></pre> <p>\u6ce8\u610f\uff1a\u7194\u65ad\u63a7\u5236\u662f\u5728\u6d88\u8d39\u8005\u65b9\u3002</p>"},{"location":"featured-topics/application-bmi/service-management.html#_4","title":"\u9a8c\u8bc1","text":"<p>\u5bf9 \u4f53\u8d28\u6307\u6570\u8ba1\u7b97\u5668 \u5fae\u670d\u52a1\u8fdb\u884c\u6c34\u5e73\u6269\u5c55\uff0c\u4f7f\u5176\u8fd0\u884c\u5b9e\u4f8b\u6570\u4e3a2\uff0c\u5373\u65b0\u589e\u4e00\u4e2a\u8fd0\u884c\u5b9e\u4f8b\uff1a</p> <pre><code>mvn spring-boot:run -Dspring-boot.run.jvmArguments=\"-Dservicecomb.rest.address=0.0.0.0:7779 -Dbmi.mock.error=true\"\n</code></pre> <ul> <li>\u8bbf\u95ee http://localhost:8889 \u3002 \u8f93\u51fa\u8eab\u9ad8\u548c\u4f53\u91cd\uff0c\u8fde\u7eed\u70b9\u51fb\u51e0\u6b21\u63d0\u4ea4\uff0c\u53ef\u4ee5\u770b\u5230\u754c\u9762\u4ea4\u66ff\u51fa\u73b0\u6b63\u5e38\u548c\u9519\u8bef\u754c\u9762\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u5176\u4e2d\u4e00\u4e2a\u5b9e\u4f8b\u91cc\u9762\u6784\u9020\u4e86\u6545\u969c\u3002</li> </ul> <p></p> <ul> <li> <p>\u7ee7\u7eed\u70b9\u51fb\u754c\u9762\uff0c\u7ecf\u8fc710\u6b21\u4ee5\u540e\uff0c\u53d1\u73b0\u6545\u969c\u5b9e\u4f8b\u88ab\u7194\u65ad\u3002\u4e0d\u518d\u51fa\u73b0\u9519\u8bef\uff0c\u6240\u6709\u7684\u8bf7\u6c42\u90fd\u88ab\u6b63\u5e38\u5b9e\u4f8b\u5904\u7406\u3002\u6bcf\u95f4\u969410\u79d2\uff0c\u4f1a\u5c1d\u8bd5\u5f80\u6545\u969c\u5b9e\u4f8b\u53d1\u751f\u82e5\u5e72\u8bf7\u6c42\u3002 </p> </li> <li> <p>\u9a8c\u8bc1\u670d\u52a1\u6062\u590d\u6b63\u5e38\u3002\u91cd\u542f\u6545\u969c\u5b9e\u4f8b\uff0c\u4e0d\u6ce8\u5165\u6545\u969c\u3002 \u53ef\u4ee5\u770b\u5230\u6240\u6709\u7684\u8bf7\u6c42\u90fd\u88ab\u6b63\u5e38\u5904\u7406\uff0c\u800c\u4e14\u8bf7\u6c42\u5747\u5300\u7684\u5206\u5e03\u5728\u4e24\u4e2a\u6b63\u5e38\u5b9e\u4f8b\u3002 </p> </li> </ul>"},{"location":"featured-topics/application-porter/authentication.html","title":"\u8fdb\u884c\u8ba4\u8bc1\u548c\u9274\u6743\u8bbe\u8ba1","text":"<p>\u4f20\u7edf\u7684WEB\u5bb9\u5668\u90fd\u63d0\u4f9b\u4e86\u4f1a\u8bdd\u7ba1\u7406\uff0c\u5728\u5fae\u670d\u52a1\u67b6\u6784\u4e0b\uff0c\u8fd9\u4e9b\u4f1a\u8bdd\u7ba1\u7406\u5b58\u5728\u5f88\u591a\u7684\u9650\u5236\uff0c\u5982\u679c\u9700\u8981\u505a\u5230\u5f39\u6027\u6269\u7f29\u5bb9\uff0c\u5219\u9700\u8981\u505a\u5927\u91cf\u7684\u5b9a\u5236\u3002 \u5728porter\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528user-service\u505a\u4f1a\u8bdd\u7ba1\u7406\uff0c\u53ef\u4ee5\u901a\u8fc7login\u548csession\u4e24\u4e2a\u63a5\u53e3\u521b\u5efa\u548c\u83b7\u53d6\u4f1a\u8bdd\u4fe1\u606f\u3002\u4f1a\u8bdd\u4fe1\u606f\u6301\u4e45\u5316\u5230\u6570\u636e\u5e93\u4e2d\uff0c\u4ece\u800c\u5b9e\u73b0\u5fae\u670d\u52a1\u672c\u8eab\u7684\u65e0\u72b6\u6001\uff0c\u5fae\u670d\u52a1\u53ef\u4ee5\u5f39\u6027\u6269\u7f29\u5bb9\u3002\u5728\u66f4\u5927\u89c4\u6a21\u5e76\u53d1\u6216\u8005\u9ad8\u6027\u80fd\u8981\u6c42\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u4f1a\u8bdd\u4fe1\u606f\u5b58\u50a8\u5230\u9ad8\u901f\u7f13\u5b58\u3002</p> <pre><code>@PostMapping(path = \"/login\", produces = MediaType.APPLICATION_JSON_VALUE)\n\npublic SessionInfo login(@RequestParam(name = \"userName\") String userName,\n\n@RequestParam(name = \"password\") String password)\n\n\n\n@GetMapping(path = \"/session\", produces = MediaType.APPLICATION_JSON_VALUE)\n\npublic SessionInfo getSession(@RequestParam(name = \"sessionId\") String sessionId)\n</code></pre> <p>\u540c\u65f6\u65b0\u589e\u4e86\u4f1a\u8bdd\u7ba1\u7406\u7684\u6570\u636e\u8868\u8bbe\u8ba1\uff1a</p> <pre><code>CREATE TABLE `T_SESSION` (\n `ID` INTEGER(8) NOT NULL AUTO_INCREMENT COMMENT '\u552f\u4e00\u6807\u8bc6',\n `SESSION_ID` VARCHAR(64) NOT NULL COMMENT '\u4e34\u65f6\u4f1a\u8bddID',\n `USER_NAME` VARCHAR(64) NOT NULL COMMENT '\u7528\u6237\u540d\u79f0',\n `ROLE_NAME` VARCHAR(64) NOT NULL COMMENT '\u89d2\u8272\u540d\u79f0',\n `CREATION_TIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '\u521b\u5efa\u65f6\u95f4',\n `ACTIVE_TIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '\u6700\u8fd1\u6d3b\u8dc3\u65f6\u95f4',\n PRIMARY KEY (`ID`)\n);\n</code></pre> <p>\u4f1a\u8bdd\u7ba1\u7406\u548c\u8ba4\u8bc1\u90fd\u5728gateway-service\u8fdb\u884c\uff0c\u9274\u6743\u5219\u9700\u8981\u4f7f\u7528\u5230\u7528\u6237\u4fe1\u606f\u3002\u4e3a\u4e86\u8ba9\u5fae\u670d\u52a1\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u7684\u65f6\u5019\uff0c\u4e0d\u81f3\u4e8e\u518d\u67e5\u8be2user-service\uff0c\u6211\u4eec\u5229\u7528\u4e86Context\u673a\u5236\uff0c\u5728Context\u91cc\u9762\u5b58\u50a8\u4e86session\u4fe1\u606f\uff0c\u6240\u6709\u7684\u5fae\u670d\u52a1\u90fd\u53ef\u4ee5\u76f4\u63a5\u4eceContext\u91cc\u9762\u53d6\u5230session\u4fe1\u606f\uff0c\u975e\u5e38\u65b9\u4fbf\u548c\u7075\u6d3b\u3002\u5b8c\u6210\u8fd9\u4e2a\u529f\u80fd\u6709\u5982\u4e0b\u51e0\u4e2a\u5173\u952e\u6b65\u9aa4\uff1a</p> <ul> <li>gateway-service\u8fdb\u884cHTTP\u534f\u8bae\u5230Invocation\u7684\u8f6c\u6362</li> </ul> <p>\u8fd9\u4e2a\u901a\u8fc7\u91cd\u8f7d InvocationCreator \u5b9e\u73b0\u3002\u5c06\u4f1a\u8bddID\u901a\u8fc7Context\u4f20\u9012\u7ed9handler\u3002</p> <pre><code>InvocationCreator creator = new EdgeInvocationCreator(context, requestEx, responseEx,\n microserviceName, path) {\n @Override\n protected Invocation createInstance() {\n Invocation invocation = super.createInstance();\n // get session id from header and cookie for debug reasons\n String sessionId = context.request().getHeader(\"session-id\");\n if (sessionId != null) {\n invocation.addContext(\"session-id\", sessionId);\n } else {\n Cookie sessionCookie = context.request().getCookie(\"session-id\");\n if (sessionCookie != null) {\n invocation.addContext(\"session-id\", sessionCookie.getValue());\n }\n }\n return invocation;\n }\n};\n</code></pre> <ul> <li>\u901a\u8fc7\u5904\u7406\u94fe\u6765\u8fdb\u884c\u8ba4\u8bc1\u548c\u4f1a\u8bdd\u7ba1\u7406</li> </ul> <p>\u5bf9\u4e8eui\u754c\u9762\uff0c\u4e0d\u63d0\u4f9b\u8ba4\u8bc1\uff0c\u7528\u6237\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u3002\u5bf9\u4e8eREST\u63a5\u53e3\u9700\u8981\u8fdb\u884c\u8ba4\u8bc1\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u8ba4\u8bc1\u548c\u4f1a\u8bdd\u7ba1\u7406\u7684\u529f\u80fd\u5728Hanlder\u4e2d\u5b9e\u73b0\u3002\u4e0b\u9762\u7684\u4ee3\u7801\u5bf9user-service\u7684login\u63a5\u53e3\u76f4\u63a5\u8f6c\u53d1\u8bf7\u6c42\uff0c\u5176\u4ed6\u8bf7\u6c42\u5148\u7ecf\u8fc7\u4f1a\u8bdd\u6821\u9a8c\uff0c\u518d\u8fdb\u884c\u8f6c\u53d1\u3002</p> <p>\u6ce8\u610f: \u5728\u7f51\u5173\u6267\u884c\u7684\u5904\u7406\u94fe\u903b\u8f91\uff0c\u662freactive\u6a21\u5f0f\u7684\uff0c\u4e0d\u80fd\u4f7f\u7528\u963b\u585e\u8c03\u7528\uff0c\u5426\u5219\u4f1a\u5bfc\u81f4\u7ebf\u7a0b\u963b\u585e\u3002</p> <pre><code>@Component\npublic class AuthHandler extends AbstractFilter implements EdgeFilter {\n @RpcReference(microserviceName = \"user-service\", schemaId = \"user\")\n private UserService userService;\n\n // session expires in 10 minutes, cache for 1 seconds to get rid of concurrent scenarios.\n private Cache&lt;String, String&gt; sessionCache = CacheBuilder.newBuilder()\n .expireAfterAccess(30, TimeUnit.SECONDS)\n .build();\n\n @Override\n public CompletableFuture&lt;Response&gt; onFilter(Invocation invocation, FilterNode nextNode) {\n if (invocation.getMicroserviceName().equals(\"user-service\")\n &amp;&amp; (invocation.getOperationName().equals(\"login\")\n || (invocation.getOperationName().equals(\"getSession\")))) {\n // login\uff1areturn session id, set cookie by javascript\n return nextNode.onFilter(invocation);\n } else {\n // check session\n String sessionId = invocation.getContext(\"session-id\");\n if (sessionId == null) {\n throw new InvocationException(403, \"\", \"session is not valid.\");\n }\n\n String sessionInfo = sessionCache.getIfPresent(sessionId);\n if (sessionInfo != null) {\n try {\n // session info stored in InvocationContext. Microservices can get it. \n invocation.addContext(\"session-id\", sessionId);\n invocation.addContext(\"session-info\", sessionInfo);\n return nextNode.onFilter(invocation);\n } catch (Exception e) {\n return CompletableFuture.completedFuture(Response.failResp(new InvocationException(500, \"\", e.getMessage())));\n }\n }\n\n // In edge, handler is executed in reactively. Must have no blocking logic.\n CompletableFuture&lt;SessionInfo&gt; result = userService.getSession(sessionId);\n return result.whenComplete((info, e) -&gt; {\n if (result.isCompletedExceptionally()) {\n throw new InvocationException(403, \"\", \"session is not valid.\");\n } else {\n if (info == null) {\n throw new InvocationException(403, \"\", \"session is not valid.\");\n }\n try {\n // session info stored in InvocationContext. Microservices can get it. \n invocation.addContext(\"session-id\", sessionId);\n String sessionInfoStr = JsonUtils.writeValueAsString(info);\n invocation.addContext(\"session-info\", sessionInfoStr);\n sessionCache.put(sessionId, sessionInfoStr);\n } catch (Exception ee) {\n throw new InvocationException(500, \"\", ee.getMessage());\n }\n }\n }).thenCompose(info -&gt; nextNode.onFilter(invocation));\n }\n }\n\n @Override\n public int getOrder() {\n return -1890;\n }\n\n @Override\n public String getName() {\n return \"edge-auth\";\n }\n}\n\n</code></pre> <ul> <li>\u7ed9\u5220\u9664\u6587\u4ef6\u589e\u52a0\u9274\u6743</li> </ul> <p>\u5728\u4e0a\u9762\u7684\u6b65\u9aa4\u4e2d\uff0c\u5df2\u7ecf\u5c06\u4f1a\u8bdd\u4fe1\u606f\u8bbe\u7f6e\u5230Context\u91cc\u9762\uff0cfile-service\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528\u8fd9\u4e9b\u4fe1\u606f\u8fdb\u884c\u9274\u6743\u64cd\u4f5c\u3002</p> <pre><code>@DeleteMapping(path = \"/delete\", produces = MediaType.APPLICATION_JSON_VALUE)\npublic boolean deleteFile(@RequestParam(name = \"id\") String id) {\n String session = ContextUtils.getInvocationContext().getContext(\"session-info\");\n if (session == null) {\n throw new InvocationException(403, \"\", \"not allowed\");\n } else {\n SessionInfo sessionInfo = null;\n try {\n sessionInfo = JsonUtils.readValue(session.getBytes(\"UTF-8\"), SessionInfo.class);\n } catch (Exception e) {\n throw new InvocationException(403, \"\", \"session not allowed\");\n }\n if (sessionInfo == null || !sessionInfo.getRoleName().equals(\"admin\")) {\n throw new InvocationException(403, \"\", \"not allowed\");\n }\n }\n return fileService.deleteFile(id);\n}\n</code></pre> <p>\u5230\u8fd9\u91cc\u4e3a\u6b62\uff0c\u8ba4\u8bc1\u3001\u4f1a\u8bdd\u7ba1\u7406\u548c\u9274\u6743\u7684\u903b\u8f91\u57fa\u672c\u5df2\u7ecf\u5b8c\u6210\u4e86\u3002\u53ef\u4ee5\u901a\u8fc7Postman\u7b49\u5de5\u5177\u8fdb\u884c\u6d41\u7a0b\u76f8\u5173\u7684\u6d4b\u8bd5\u3002</p> <pre><code>#### \u4f1a\u8bdd\u7ba1\u7406\u63a5\u53e3\u8c03\u7528\u793a\u4f8b\uff0c\u8c03\u7528\u5220\u9664\u6587\u4ef6\u63a5\u53e3\u3002\u4f7f\u7528guest\u7528\u6237\u7684\u4f1a\u8bdd\u7684\u60c5\u51b5\u3002\n\n#Request\nDELETE http://localhost:9090/api/file-service/delete?id=ba6bd8a2-d31a-42cd-a1be-9fb3d6ab4c82\n\nsession-id: 1be646c0-50cb-4c0a-968d-2a512775f5e8\n\n#Response\n{\n \"message\": \"not allowed\"\n}\n</code></pre>"},{"location":"featured-topics/application-porter/authentication.html#js","title":"\u5f00\u53d1JS\u811a\u672c\u7ba1\u7406\u4f1a\u8bdd","text":"<p>\u9996\u5148\u9700\u8981\u63d0\u4f9b\u767b\u9646\u6846\uff0c\u8ba9\u7528\u6237\u8f93\u5165\u7528\u6237\u540d\u5bc6\u7801\uff1a</p> <pre><code>&lt;div class=\"form\"&gt;\n &lt;h2&gt;\u767b\u5f55&lt;/h2&gt;\n &lt;input id=\"username\" type=\"text\" name=\"Username\" placeholder=\"Username\"&gt;\n &lt;input id=\"paasword\" type=\"password\" name=\"Password\" placeholder=\"Password\" &gt;\n &lt;input type=\"button\" value=\"Login\" onclick=\"loginAction()\"&gt;\n&lt;/div&gt;\n</code></pre> <p>\u5b9e\u73b0\u767b\u9646\u903b\u8f91\u3002\u767b\u9646\u9996\u5148\u8c03\u7528\u540e\u53f0\u767b\u9646\u63a5\u53e3\uff0c\u767b\u9646\u6210\u529f\u540e\u8bbe\u7f6e\u4f1a\u8bddcookie:</p> <pre><code>function loginAction() {\n var username = document.getElementById(\"username\").value;\n var password = document.getElementById(\"paasword\").value;\n var formData = {};\n formData.userName = username;\n formData.password = password;\n\n $.ajax({\n type: 'POST',\n url: \"/api/user-service/login\",\n data: formData,\n success: function (data) {\n setCookie(\"session-id\", data.sessiondId, false);\n window.alert('\u767b\u9646\u6210\u529f\uff01');\n },\n error: function(data) {\n console.log(data);\n window.alert('\u767b\u9646\u5931\u8d25\uff01' + data);\n },\n async: true\n });\n}\n</code></pre>"},{"location":"featured-topics/application-porter/design.html","title":"\u8bbe\u8ba1\u5fae\u670d\u52a1","text":"<p>\u6839\u636eUser Story\uff0c\u5e94\u7528\u81f3\u5c11\u5305\u542b\u7528\u6237\u7ba1\u7406\u3001\u6587\u4ef6\u7ba1\u7406\u7b49\u5fae\u670d\u52a1\uff0c\u6bcf\u4e2a\u5fae\u670d\u52a1\u90fd\u884c\u4f7f\u4e0d\u4e00\u6837\u7684\u529f\u80fd\u3002\u4e0b\u9762\u662f\u5206\u89e3\u540e\u8bbe\u8ba1\u7684\u5fae\u670d\u52a1\u7ed3\u6784\uff1a</p> <p></p> <p>\u7f51\u5173\uff1a\u8d1f\u8d23\u8fdb\u884c\u8bf7\u6c42\u8f6c\u53d1\u3001\u7528\u6237\u8ba4\u8bc1\u4ee5\u53ca\u5176\u4ed6\u5185\u5bb9\uff0c\u6bd4\u5982\u89e3\u51b3\u8de8\u7ad9\u8bbf\u95ee\u3001\u8bbe\u7f6eHTTP\u5b89\u5168\u6d88\u606f\u5934\u7b49\u3002\u901a\u8fc7\u8bbe\u7f6e\u9632\u706b\u5899\uff0c\u6240\u6709\u7684\u8bf7\u6c42\u90fd\u5fc5\u987b\u7ecf\u8fc7\u7f51\u5173\uff0c\u8fd9\u6837\u5c31\u5c06\u5185\u90e8\u670d\u52a1\u4e0e\u5916\u90e8\u7528\u6237\u9694\u79bb\u8d77\u6765\uff0c\u9632\u6b62\u5185\u90e8\u670d\u52a1\u88ab\u975e\u6cd5\u8bbf\u95ee\u3002</p> <p>\u6587\u4ef6\u7ba1\u7406\uff1a \u63d0\u4f9b\u6587\u4ef6\u4e0a\u4f20\u3001\u5220\u9664\u7b49\u6587\u4ef6\u7ba1\u7406\u529f\u80fd\u3002</p> <p>\u7528\u6237\u7ba1\u7406\uff1a \u63d0\u4f9b\u8ba4\u8bc1\u3001\u89d2\u8272\u548c\u6743\u9650\u7ba1\u7406\u7b49\u529f\u80fd\u3002</p> <p>\u754c\u9762\uff1a \u91c7\u7528\u9759\u6001\u9875\u9762\u6280\u672f, html+js+css\u5b9e\u73b0\u3002\u754c\u9762\u53ef\u4ee5\u4f5c\u4e3a\u4e00\u4e2a\u5355\u72ec\u7684\u5fae\u670d\u52a1\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u653e\u5230\u7f51\u5173\u670d\u52a1\u91cc\u9762\u3002\u6216\u8005\u4f7f\u7528CDN\u7b49\u8fdb\u884c\u90e8\u7f72\u3002\u5728\u672c\u4f8b\u5b50\u4e2d\uff0c\u4e3a\u4e86\u90e8\u7f72\u7b80\u5355\uff0c\u5c06\u754c\u9762\u4f7f\u7528\u7f51\u5173\u8fdb\u884c\u6258\u7ba1\u3002</p> <p>\u4e3a\u4e86\u53ef\u9760\u6027\uff0c\u8fd9\u4e9b\u670d\u52a1\u90fd\u5e94\u8be5\u652f\u6301\u5206\u5e03\u5f0f\u96c6\u7fa4\u90e8\u7f72\u3002\u56e0\u6b64\u5728\u4e1a\u52a1\u903b\u8f91\u4e2d\u6d89\u53ca\u5230\u5e76\u53d1\u548c\u8d1f\u8f7d\u5747\u8861\u7684\u573a\u666f\uff0c\u90fd\u9700\u8981\u8003\u8651\u65e0\u72b6\u6001\u8bbe\u8ba1\u3002\u53ef\u4ee5\u7ed9\u7f51\u5173\u914d\u7f6e\u57df\u540d\u6216\u8005\u5728\u4e0a\u5c42\u518d\u6302\u4e00\u4e2a\u5f39\u6027\u8d1f\u8f7d\u5747\u8861\u5668\uff0c\u5b9e\u73b0\u7f51\u5173\u7684\u591a\u5b9e\u4f8b\u90e8\u7f72\u3002</p> <p>\u5fae\u670d\u52a1\u8bbe\u8ba1\u597d\u4ee5\u540e\uff0c\u53ef\u4ee5\u901a\u8fc7\u5df2\u6709\u9879\u76ee\u5feb\u901f\u642d\u5efa\u9879\u76ee\u67b6\u5b50\u3002\u53ef\u4ee5\u4ece\uff1a</p> <p>Porter\u5e94\u7528 </p> <p>\u4e0b\u8f7d\u8be5\u9879\u76ee\u3002</p>"},{"location":"featured-topics/application-porter/file-service.html","title":"\u5f00\u53d1\u6587\u4ef6\u4e0a\u4f20\u529f\u80fd","text":"<p>\u6587\u4ef6\u4e0a\u4f20\u529f\u80fd\u3001\u7528\u6237\u7ba1\u7406\u529f\u80fd\u90fd\u53ea\u9700\u8981\u63d0\u4f9bREST\u63a5\u53e3\u3002</p> <ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb</li> </ul> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;solution-basic&lt;/artifactId&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-standalone&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3</li> </ul> <p>\u670d\u52a1\u63a5\u53e3\u5b9a\u4e49\u4e0a\u67093\u79cd\u9009\u62e9\uff1aRPC\u3001Spring MVC\u3001JAX RS\u3002 \u8fd9\u91cc\u9009\u62e9\u4e86Sping MVC\uff0c\u76f8\u6bd4RPC\u9700\u8981\u989d\u5916\u589e\u52a0Annotation\uff0c\u7075\u6d3b\u6027\u5728\u4e8e\u63a5\u53e3\u5373\u53ef\u4ee5\u901a\u8fc7RPC\u7684\u65b9\u5f0f\u5728\u670d\u52a1\u5185\u90e8\u8bbf\u95ee\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee\uff0c\u671f\u671b\u524d\u53f0js\u811a\u672c\u5f00\u53d1\u8005\u4e5f\u80fd\u591f\u5bf9\u7167\u751f\u6210\u7684\u5951\u7ea6\u5b8c\u6210\u5f00\u53d1\u3002</p> <pre><code>@RestSchema(schemaId = \"file\")\n@RequestMapping(path = \"/\")\npublic class FileEndpoint {\n @Autowired\n private FileService fileService;\n\n /**\n * upload and return file id\n */\n @PostMapping(path = \"/upload\", produces = MediaType.TEXT_PLAIN_VALUE)\n public String uploadFile(@RequestPart(name = \"fileName\") MultipartFile file) {\n return fileService.uploadFile(file);\n }\n\n /**\n * delete file by id\n */\n @DeleteMapping(path = \"/delete\", produces = MediaType.APPLICATION_JSON_VALUE)\n public boolean deleteFile(@RequestParam(name = \"id\") String id) {\n return fileService.deleteFile(id);\n }\n}\n\n</code></pre> <p>\u4e3a\u4e86\u5b9e\u73b0\u4e0d\u540c\u65b9\u5f0f\u7684\u6587\u4ef6\u5b58\u50a8\uff0c\u5c06\u5b9e\u73b0\u62bd\u8c61\u51fa\u6765FileService\u3002\u4e3a\u4e86\u7b80\u5355\uff0c\u5f53\u524d\u53ea\u63d0\u4f9b\u4e86\u672c\u5730\u6587\u4ef6\u5b9e\u73b0\u3002\u8fd9\u4e2a\u5b9e\u73b0\u9650\u5236\u4e86\u8be5\u670d\u52a1\u65e0\u6cd5\u8fdb\u884c\u591a\u5b9e\u4f8b\u90e8\u7f72\u3002\u53ef\u4ee5\u8003\u8651\u4f7f\u7528\u5bf9\u8c61\u5b58\u50a8\u670d\u52a1\u5668\u3001\u5206\u5e03\u5f0f\u6587\u4ef6\u7cfb\u7edf\u7b49\u6ee1\u8db3\u5b58\u50a8\u8981\u6c42\u3002</p> <ul> <li>\u8bbe\u7f6e\u4e34\u65f6\u76ee\u5f55</li> </ul> <p>\u9700\u8981\u589e\u52a0 <code>servicecomb.uploads.directory</code> \u914d\u7f6e\u9879\uff0c\u6307\u5b9a\u4e34\u65f6\u76ee\u5f55\u7684\u8def\u5f84\u3002\u9700\u8981\u4fdd\u8bc1\u76ee\u5f55\u6709\u5199\u6743\u9650\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5982\u679c\u6ca1\u8bbe\u7f6e\u4e34\u65f6\u76ee\u5f55\uff0c\u4e0d\u5141\u8bb8\u542f\u7528\u4e0a\u4f20\u529f\u80fd\u3002\u5982\u679c\u4f7f\u7528\u7f51\u5173\uff0c\u7f51\u5173\u4e5f\u9700\u8981\u589e\u52a0\u8fd9\u4e2a\u914d\u7f6e\u9879\u3002</p> <ul> <li>\u5f00\u53d1\u6d4b\u8bd5HTML\uff0c\u8bbf\u95ee\u4e0a\u4f20\u670d\u52a1</li> </ul> <p>\u4e3a\u4e86\u6d4b\u8bd5\u5f00\u53d1\u7684\u63a5\u53e3\uff0c\u53ef\u4ee5\u5199\u4e00\u4e2aHTML\u7a0b\u5e8f\u3002\u6ce8\u610fname\u53c2\u6570\u9700\u8981\u548c\u63a5\u53e3\u5b9a\u4e49\u7684\u540d\u79f0\u4e00\u6837\u3002</p> <pre><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;Upload Example&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n &lt;h2&gt;Upload Example&lt;/h2&gt;\n &lt;hr/&gt;\n &lt;form method=\"POST\" enctype=\"multipart/form-data\"\n action=\"http://localhost:9091/upload\"&gt;\n &lt;p&gt;\n File Name: &lt;input type=\"file\" name=\"fileName\" /&gt;\n &lt;/p&gt;\n &lt;p&gt;\n &lt;input type=\"submit\" value=\"Upload\" /&gt;\n &lt;/p&gt;\n &lt;/form&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre> <p>\u53ef\u4ee5\u4f7f\u7528Postman\u7b49\u5de5\u5177\u6d4b\u8bd5\u5220\u9664\u63a5\u53e3\uff1a</p> <pre><code>DELETE http://localhost:9091/delete?id=ba6bd8a2-d31a-42cd-a1be-9fb3d6ab4c82\n</code></pre> <p>\u8fd8\u53ef\u4ee5\u5f00\u53d1\u4e00\u4e2a\u5ba2\u6237\u7aef\u6d4b\u8bd5\u8fd9\u4e9b\u63a5\u53e3\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u662f\u975e\u5e38\u6709\u7528\u7684\u3002\u8fd9\u91cc\u4e0d\u518d\u8be6\u7ec6\u8bf4\u660e\u3002</p>"},{"location":"featured-topics/application-porter/gateway-service.html","title":"\u5f00\u53d1\u7f51\u5173","text":"<p>\u8fd9\u4e2a\u7ae0\u8282\u4e2d\uff0c\u4ecb\u7ecd\u5982\u4f55\u901a\u8fc7\u7f51\u5173\u8f6c\u53d1\u8bf7\u6c42\u3002Java Chassis \u63d0\u4f9b\u4e86\u975e\u5e38\u7075\u6d3b\u7684\u7f51\u5173\u670d\u52a1\uff0c\u5f00\u53d1\u8005\u80fd\u591f\u975e\u5e38\u7b80\u5355\u7684\u5b9e\u73b0\u5fae\u670d\u52a1\u4e4b\u95f4\u7684\u8f6c\u53d1\uff0c\u7f51\u5173\u62e5\u6709\u5ba2\u6237\u7aef\u4e00\u6837\u7684\u670d\u52a1\u6cbb\u7406\u80fd\u529b\u3002</p> <p>\u7f51\u5173\u670d\u52a1\u7531\u4e00\u7cfb\u5217\u7684VertxHttpDispatcher\u7ec4\u6210\uff0c\u5f00\u53d1\u8005\u901a\u8fc7\u7ee7\u627fAbstractEdgeDispatcher\uff0c\u6765\u5b9e\u73b0\u81ea\u5df1\u7684\u8f6c\u53d1\u673a\u5236\u3002</p> <p>\u4e3a\u4e86\u5b9e\u73b0gateway-service\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230file-service\uff0c\u5b9a\u4e49\u4e86\u5982\u4e0b\u89c4\u5219\uff1a</p> <ul> <li> <p>\u76f4\u63a5\u8bf7\u6c42file-service: DELETE http://localhost:9091/delete</p> </li> <li> <p>\u901a\u8fc7\u7f51\u5173\uff1aDELETE http://localhost:9090/api/file-service/delete</p> </li> </ul> <p>\u8fbe\u5230\u8fd9\u4e2a\u76ee\u7684\u7684\u4ee3\u7801\u5982\u4e0b\uff0c\u5728\u8bf7\u6c42\u5904\u7406\u7684\u65f6\u5019\uff0c\u4f7f\u7528EdgeInvocation\uff0c\u53ef\u4ee5\u5b9e\u73b0\u8bf7\u6c42\u8f6c\u53d1\uff0c\u5e76\u5f00\u542f\u5404\u79cd\u6cbb\u7406\u529f\u80fd\u3002\u4e0b\u9762\u4ee3\u7801\u7684\u6838\u5fc3\u5185\u5bb9\u662f\u5b9a\u4e49\u8f6c\u53d1\u89c4\u5219regex\u3002</p> <pre><code>public class ApiDispatcher extends AbstractEdgeDispatcher {\n public static final String MICROSERVICE_NAME = \"param0\";\n\n @Override\n public int getOrder() {\n return 10002;\n }\n\n @Override\n public void init(Router router) {\n String regex = \"/api/([^\\\\/]+)/(.*)\";\n router.routeWithRegex(regex).handler(createBodyHandler());\n router.routeWithRegex(regex).failureHandler(this::onFailure).handler(this::onRequest);\n }\n\n protected void onRequest(RoutingContext context) {\n String microserviceName = extractMicroserviceName(context);\n String path = Utils.findActualPath(context.request().path(), 2);\n\n requestByFilter(context, microserviceName, path);\n }\n\n @Nullable\n private String extractMicroserviceName(RoutingContext context) {\n return context.pathParam(MICROSERVICE_NAME);\n }\n\n protected void requestByFilter(RoutingContext context, String microserviceName, String path) {\n HttpServletRequestEx requestEx = new VertxServerRequestToHttpServletRequest(context);\n HttpServletResponseEx responseEx = new VertxServerResponseToHttpServletResponse(context.response());\n InvocationCreator creator = new EdgeInvocationCreator(context, requestEx, responseEx,\n microserviceName, path) {\n @Override\n protected Invocation createInstance() {\n Invocation invocation = super.createInstance();\n // get session id from header and cookie for debug reasons\n String sessionId = context.request().getHeader(\"session-id\");\n if (sessionId != null) {\n invocation.addContext(\"session-id\", sessionId);\n } else {\n Cookie sessionCookie = context.request().getCookie(\"session-id\");\n if (sessionCookie != null) {\n invocation.addContext(\"session-id\", sessionCookie.getValue());\n }\n }\n return invocation;\n }\n };\n new RestProducerInvocationFlow(creator, requestEx, responseEx)\n .run();\n }\n}\n</code></pre> <p>\u4e3a\u4e86\u5b9e\u73b0gateway-service\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230porter-website\uff0c\u5b9a\u4e49\u4e86\u5982\u4e0b\u89c4\u5219\uff1a</p> <ul> <li> <p>\u76f4\u63a5\u8bf7\u6c42porter-website: GET http://localhost:9093/index.html</p> </li> <li> <p>\u901a\u8fc7\u7f51\u5173\uff1aGET http://localhost:9090/ui/porter-website/index.html</p> </li> </ul> <p>\u5b8c\u6210VertxHttpDispatcher\u5f00\u53d1\u540e\uff0c\u9700\u8981\u901a\u8fc7SPI\u7684\u65b9\u5f0f\u52a0\u8f7d\u5230\u7cfb\u7edf\u4e2d\uff0c\u9700\u8981\u589e\u52a0META-INF/services/org.apache.servicecomb.transport.rest.vertx.VertxHttpDispatcher\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u5c06\u589e\u52a0\u7684\u4e24\u4e2a\u5b9e\u73b0\u5199\u5165\u8be5\u914d\u7f6e\u6587\u4ef6\u4e2d\u3002</p> <p>\u7f51\u5173\u670d\u52a1\u5f00\u53d1\u5b8c\u6210\u540e\uff0c\u6240\u6709\u7684\u7528\u6237\u8bf7\u6c42\u90fd\u53ef\u4ee5\u901a\u8fc7\u7f51\u5173\u6765\u53d1\u9001\u3002\u5f00\u53d1\u8005\u901a\u8fc7\u901a\u8fc7\u8bbe\u7f6e\u9632\u706b\u5899\u7b49\u673a\u5236\uff0c\u9650\u5236\u7528\u6237\u76f4\u63a5\u8bbf\u95ee\u5185\u90e8\u670d\u52a1\uff0c\u4fdd\u8bc1\u5185\u90e8\u670d\u52a1\u7684\u5b89\u5168\u3002</p>"},{"location":"featured-topics/application-porter/https.html","title":"\u7f51\u5173HTTPS\u5b89\u5168\u914d\u7f6e","text":"<p>HTTP\u534f\u8bae\u5df2\u9010\u6e10\u88ab\u6807\u8bb0\u4e3a\u4e0d\u5b89\u5168\uff0c\u914d\u7f6eHTTPS\u53ef\u4ee5\u9632\u6b62\u7528\u6237\u6570\u636e\u88ab\u7a83\u53d6\u548c\u7be1\u6539\uff0c\u63d0\u5347\u4e86\u5b89\u5168\u6027\u3002\u8003\u8651\u5230\u6027\u80fd\u7684\u5f71\u54cd\uff0c\u6211\u4eec\u53ea\u5728\u7f51\u5173\u4f7f\u7528HTTPS\u63a5\u5165\uff0c\u5185\u90e8\u670d\u52a1\u4e4b\u95f4\u4ecd\u7136\u4f7f\u7528HTTP\u3002</p> <p>\u4f7f\u7528HTTPS\u4e4b\u524d\uff0c\u9700\u8981\u51c6\u5907\u8bc1\u4e66\u3002\u901a\u5e38\u662f\u5411\u6743\u5a01\u673a\u6784\u7533\u8bf7\uff0c\u8fd9\u6837\u7684\u8bc1\u4e66\u624d\u4f1a\u88ab\u6d4f\u89c8\u5668\u7b49\u8bbe\u5907\u6807\u8bb0\u4e3a\u53ef\u4fe1\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u901a\u8fc7\u5de5\u5177\u5df2\u7ecf\u751f\u6210\u597d\u7684\u8bc1\u4e66\u3002\u5e76\u4e14\u5c06\u81ea\u5df1\u7684\u8bc1\u4e66\u901a\u8fc7PKCS12\u683c\u5f0f\u5b58\u50a8\u5728server.p12\u6587\u4ef6\u4e2d\uff0c\u5c06CA\u7684\u8bc1\u4e66\u4f7f\u7528JKS\u683c\u5f0f\u5b58\u50a8\u5728trust.jks\u4e2d\u3002</p> <p>\u7f51\u5173\u542f\u7528HTTP\u53ea\u9700\u8981\u5728\u76d1\u542c\u7684\u7aef\u53e3\u4e2d\u589e\u52a0sslEnabled\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:9090?sslEnabled=true\n</code></pre> <p>\u7136\u540e\u589e\u52a0ssl\u76f8\u5173\u7684\u914d\u7f6e\u3002\u4e0b\u9762\u7684\u914d\u7f6e\u5305\u542b\u4e86TLS\u7684\u534f\u8bae\u3001\u662f\u5426\u8ba4\u8bc1\u5bf9\u7aef\u4ee5\u53ca\u8bc1\u4e66\u548c\u5bc6\u7801\u4fe1\u606f\u3002\u5176\u4e2d<code>EdgeSSLCustom</code>\u7528\u4e8e\u8bc1\u4e66\u8def\u5f84\u548c\u8bc1\u4e66\u5bc6\u7801\u7684\u8f6c\u6362\uff0c\u4e0d\u5b9e\u73b0\u7684\u65f6\u5019\uff0c\u9ed8\u8ba4\u4ece\u5f53\u524d\u76ee\u5f55\u8bfb\u53d6\u8bc1\u4e66\u6587\u4ef6\uff0c\u8bc1\u4e66\u7684\u5bc6\u7801\u660e\u6587\u5b58\u50a8\u3002\u5f53\u4e1a\u52a1\u9700\u8981\u505a\u4e00\u4e9b\u9ad8\u7ea7\u5b89\u5168\u7279\u6027\uff0c\u6bd4\u5982\u5bc6\u7801\u4fdd\u62a4\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u8fd9\u4e2a\u7c7b\u5b9e\u73b0\u3002</p> <pre><code>ssl.protocols: TLSv1.2\nssl.authPeer: false\nssl.checkCN.host: false\nssl.trustStore: trust.jks\nssl.trustStoreType: JKS\nssl.trustStoreValue: Changeme_123\nssl.keyStore: server.p12\nssl.keyStoreType: PKCS12\nssl.keyStoreValue: Changeme_123\nssl.crl: revoke.crl\nssl.sslCustomClass: org.apache.servicecomb.samples.porter.gateway.EdgeSSLCustom\n</code></pre> <p>\u5f00\u53d1\u5b8c\u6210\u540e\uff0c\u8bbf\u95ee\u754c\u9762\u5c31\u53ef\u4ee5\u901a\u8fc7https\u8fdb\u884c\u4e86</p> <pre><code>https://localhost:9090/ui/porter-website/index.html\n</code></pre>"},{"location":"featured-topics/application-porter/porter-website.html","title":"\u5f00\u53d1\u754c\u9762","text":"<p>\u5728\u6280\u672f\u9009\u62e9\u4e0a\uff0c\u754c\u9762\u5b8c\u5168\u7531html+js+css\u7b49\u9759\u6001\u7f51\u9875\u6280\u672f\u6784\u6210\uff0c\u4e0d\u91c7\u7528\u52a8\u6001\u9875\u9762\u6280\u672f\u3002\u91c7\u7528\u9759\u6001\u9875\u9762\u6280\u672f\u6784\u5efa\u754c\u9762\uff0c\u4f7f\u5f97\u6574\u4e2a\u5fae\u670d\u52a1\u7cfb\u7edf\u66f4\u52a0\u5177\u5907\u5f39\u6027\uff0c\u80fd\u591f\u975e\u5e38\u5bb9\u6613\u7684\u8fdb\u884c\u6269\u5bb9\uff0c\u76f8\u5173\u5f00\u53d1\u6210\u679c\u4e5f\u80fd\u591f\u66f4\u597d\u7684\u88ab\u5176\u4ed6\u5e94\u7528\u7ee7\u627f\u3002</p> <p>\u91c7\u7528\u9759\u6001\u9875\u9762\u6280\u672f\uff0c\u4e5f\u4f7f\u5f97\u754c\u9762\u670d\u52a1\u90e8\u7f72\u66f4\u52a0\u7075\u6d3b\u591a\u6837\uff1a</p> <ul> <li>\u5c06\u9759\u6001\u9875\u9762\u90e8\u7f72\u5230nginx\uff0cnginx\u5c06REST\u8bf7\u6c42\u8f6c\u53d1\u5230gateway-service\u3002</li> <li>\u5c06\u9759\u6001\u9875\u9762\u76f4\u63a5\u90e8\u7f72\u5230gateway-service\u3002</li> <li>\u9759\u6001\u9875\u9762\u901a\u8fc7Tomcat\u3001Spring Boot\u7b49Web\u670d\u52a1\u5668\u90e8\u7f72\uff0c\u5e76\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\uff0cgateway-service\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230\u5bf9\u5e94\u7684\u5e94\u7528\u670d\u52a1\u5668\u4e0a\u3002</li> <li>\u9759\u6001\u9875\u9762\u7531\u7b2c\u4e09\u65b9\u5f00\u53d1\uff0c\u7b2c\u4e09\u65b9\u76f4\u63a5\u901a\u8fc7gateway-service\u8bbf\u95eeREST\u63a5\u53e3\u3002\u7531\u7b2c\u4e09\u65b9\u9009\u62e9\u754c\u9762\u7684\u5f00\u53d1\u6280\u672f\u3002</li> </ul> <p>\u8fd9\u51e0\u79cd\u65b9\u5f0f\u90fd\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002</p>"},{"location":"featured-topics/application-porter/porter-website.html#gateway-service","title":"\u5c06\u9759\u6001\u9875\u9762\u76f4\u63a5\u90e8\u7f72\u5230gateway-service","text":"<p>\u5728 porter \u9879\u76ee\u4e2d\uff0c\u91c7\u7528\u4e86\u5c06\u9759\u6001\u9875\u9762\u76f4\u63a5\u90e8\u7f72\u5230gateway-service\u7684\u65b9\u5f0f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u7b80\u6d01\u9ad8\u6548\u3002\u8fd9\u79cd\u65b9\u5f0f\u7684\u6838\u5fc3\u4ee3\u7801\u662fStaticWebpageDispatcher\u3002\u5b83\u91c7\u7528vert.x\u63d0\u4f9b\u7684\u9759\u6001\u9875\u9762\u529f\u80fd\uff0c\u76f4\u63a5\u6302\u8f7d\u4e86\u9759\u6001\u9875\u9762\u670d\u52a1\u3002</p> <pre><code>public class StaticWebpageDispatcher implements VertxHttpDispatcher {\n private static final Logger LOGGER = LoggerFactory.getLogger(StaticWebpageDispatcher.class);\n\n private static final String WEB_ROOT = LegacyPropertyFactory\n .getStringProperty(\"gateway.webroot\", \"/var/static\");\n\n @Override\n public int getOrder() {\n return Integer.MAX_VALUE;\n }\n\n @Override\n public void init(Router router) {\n String regex = \"/ui/(.*)\";\n StaticHandler webpageHandler = StaticHandler.create(WEB_ROOT);\n LOGGER.info(\"server static web page for WEB_ROOT={}\", WEB_ROOT);\n router.routeWithRegex(regex).failureHandler((context) -&gt; {\n LOGGER.error(\"\", context.failure());\n }).handler(webpageHandler);\n }\n}\n</code></pre>"},{"location":"featured-topics/application-porter/user-service.html","title":"\u4f7f\u7528MyBatis\u8bbf\u95ee\u6570\u636e\u5e93","text":"<p>\u8bbf\u95ee\u6570\u636e\u5e93\u53ef\u4ee5\u4f7f\u7528\u7b2c\u4e09\u65b9\u63d0\u4f9b\u7684\u7ec4\u4ef6\u3002\u8fd9\u91cc\u9009\u62e9\u4e86MyBatis\u8bf4\u660e\u5982\u4f55\u8bbf\u95ee\u6570\u636e\u5e93\u3002\u5f00\u53d1\u8005\u4e5f\u53ef\u4ee5\u76f4\u63a5\u53c2\u8003\uff1a</p> <p>http://www.mybatis.org/spring/zh/index.html</p> <p>\u8fd9\u91cc\u7ed9\u51fa\u4e00\u4e2a\u5feb\u901f\u96c6\u6210\u53c2\u8003\u3002\u5728\u672c\u7ae0\u4e2d\u6d89\u53ca\u5230\u5efa\u8868\u7b49\u6570\u636e\u5e93\u64cd\u4f5c\u7684\u65f6\u5019\uff0c\u6570\u636e\u5e93\u9009\u7528MySQL\u3002</p>"},{"location":"featured-topics/application-porter/user-service.html#_1","title":"\u8bbe\u8ba1\u8868","text":"<p>\u672c\u5e94\u7528\u63d0\u4f9b\u4e86\u975e\u5e38\u7b80\u5355\u7684\u7528\u6237\u7ba1\u7406\u548c\u57fa\u4e8e\u89d2\u8272\u7684\u9274\u6743\u673a\u5236\u3002\u56e0\u6b64\u6211\u4eec\u8bbe\u8ba1\u4e86\u975e\u5e38\u7b80\u5355\u7684\u7528\u6237\u8868\uff0c\u8868\u683c\u5305\u542b\u4e86\u7528\u6237\u540d\u79f0\u53ca\u7528\u6237\u6240\u5c5e\u7684\u89d2\u8272\u3002\u4e3a\u4e86\u6d4b\u8bd5\u7684\u76ee\u7684\uff0c\u8fd8\u63d2\u5165\u4e86\u4e24\u4e2a\u7528\u6237\u6570\u636e\uff0c\u5176\u4e2d\u5bc6\u7801\u91c7\u7528SHA256\u8fdb\u884c\u5355\u5411\u52a0\u5bc6\u4fdd\u5b58\u3002</p> <pre><code>CREATE DATABASE IF NOT EXISTS porter_user_db;\n\nUSE porter_user_db;\n\nDROP TABLE IF EXISTS T_USER;\n\nCREATE TABLE `T_USER` (\n `ID` INTEGER(20) NOT NULL COMMENT '\u7528\u6237ID',\n `USER_NAME` VARCHAR(64) NOT NULL COMMENT '\u7528\u6237\u540d\u79f0',\n `PASSWORD` VARCHAR(64) NOT NULL COMMENT '\u7528\u6237\u5bc6\u7801',\n `ROLE_NAME` VARCHAR(64) NOT NULL COMMENT '\u89d2\u8272\u540d\u79f0',\n PRIMARY KEY (`ID`)\n);\n\ninsert into T_USER(ID, USER_NAME, PASSWORD, ROLE_NAME) values(1, \"admin\", \"n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=\", \"admin\");\ninsert into T_USER(ID, USER_NAME, PASSWORD, ROLE_NAME) values(2, \"guest\", \"n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=\", \"guest\");\n</code></pre>"},{"location":"featured-topics/application-porter/user-service.html#mybatis_1","title":"\u4f7f\u7528MyBatis","text":"<ul> <li>\u5f15\u7528MyBatis\u7684\u76f8\u5173\u4f9d\u8d56</li> </ul> <p>\u4f9d\u8d56\u5305\u542b\u4e86MyBatis\u548cSpring\u3001DBCP2\u6570\u636e\u5e93\u8fde\u63a5\u6c60\u7ba1\u7406\u76f8\u5173\u7ec4\u4ef6\u3002\u8fd9\u4e9b\u7ec4\u4ef6\u90fd\u662f\u4f7f\u7528Spring\u548cMyBatis\u5fc5\u987b\u7684\u3002</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt;\n &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt;\n &lt;exclusions&gt;\n &lt;exclusion&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-logging&lt;/artifactId&gt;\n &lt;/exclusion&gt;\n &lt;/exclusions&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;mysql&lt;/groupId&gt;\n &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;\n &lt;artifactId&gt;commons-dbcp2&lt;/artifactId&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.springframework&lt;/groupId&gt;\n &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;\n &lt;scope&gt;compile&lt;/scope&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.springframework&lt;/groupId&gt;\n &lt;artifactId&gt;spring-aop&lt;/artifactId&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.springframework&lt;/groupId&gt;\n &lt;artifactId&gt;spring-context-support&lt;/artifactId&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.springframework&lt;/groupId&gt;\n &lt;artifactId&gt;spring-tx&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u914d\u7f6e\u6570\u636e\u6e90\u548cSqlSessionFactory</li> </ul> <p>\u672c\u4f8b\u5b50\u4f7f\u7528Spring Data Source\uff0c \u53ea\u9700\u8981\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u52a0\u4e0a\u914d\u7f6e\u4fe1\u606f\uff1a</p> <pre><code>spring:\n datasource:\n url: jdbc:mysql://localhost/porter_user_db\n username: root\n password: root\n driver-class-name: com.mysql.jdbc.Driver\n</code></pre> <ul> <li>\u4e66\u5199Mapper\u6587\u4ef6</li> </ul> <p>\u6d89\u53ca\u5230JAVA\u7684Mapper\u5b9a\u4e49UserMapper\u3002</p> <pre><code>@Mapper\npublic interface UserMapper {\n @Insert(\"\"\"\n insert into T_USER (ID, USER_NAME, PASSWORD, ROLE_NAME)\n values(#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR},\n #{password,jdbcType=VARCHAR}, #{roleName,jdbcType=VARCHAR})\"\"\")\n void createUser(UserInfo userInfo);\n\n @Select(\"\"\"\n select ID, USER_NAME, PASSWORD, ROLE_NAME\n from T_USER where USER_NAME = #{userName,jdbcType=VARCHAR}\"\"\")\n @Results({\n @Result(property = \"id\", column = \"ID\"),\n @Result(property = \"userName\", column = \"USER_NAME\"),\n @Result(property = \"password\", column = \"PASSWORD\"),\n @Result(property = \"roleName\", column = \"ROLE_NAME\")\n })\n UserInfo getUserInfo(String userName);\n}\n\n</code></pre>"},{"location":"featured-topics/application-porter/user-service.html#_2","title":"\u8bbe\u8ba1\u7528\u6237\u670d\u52a1","text":"<p>\u7ecf\u8fc7\u4e0a\u9762\u7684\u914d\u7f6e\uff0c\u6570\u636e\u5e93\u8bbf\u95ee\u76f8\u5173\u5f00\u53d1\u5df2\u7ecf\u5b8c\u6210\u4e86\u3002 \u7ed3\u5408User Story\uff0c\u53ef\u4ee5\u5148\u8bbe\u8ba1\u4e00\u4e2alogin\u7684\u670d\u52a1\u63a5\u53e3\u3002 \u8fd9\u4e2a\u670d\u52a1\u5728UserServiceEndpoint\u91cc\u9762\u8fdb\u884c\u5b9a\u4e49\u3002</p> <pre><code>@PostMapping(path = \"/login\", produces = MediaType.APPLICATION_JSON_VALUE)\npublic SessionInfo login(@RequestParam(name = \"userName\") String userName, \n @RequestParam(name = \"password\") String password)\n</code></pre> <p>\u63a5\u53e3\u4f1a\u8fd4\u56deSessionInfo\uff0c\u8fd9\u4e9b\u5fc5\u8981\u7684\u4fe1\u606f\uff0c\u4f1a\u5728\u540e\u7eed\u7684\u9274\u6743\u3001\u8ba4\u8bc1\u64cd\u4f5c\u4e2d\u8d77\u5230\u5f88\u5927\u7684\u65b9\u4fbf\u3002</p> <p>\u7ecf\u8fc7\u4ee5\u4e0a\u7684\u5f00\u53d1\uff0c\u5c31\u53ef\u4ee5\u542f\u52a8\u7528\u6237\u670d\u52a1\uff0c\u914d\u7f6e\u6570\u636e\u5e93\u548c\u63d2\u5165\u76f8\u5173\u6570\u636e\uff0c\u4ece\u754c\u9762\u8bbf\u95ee\u8fd9\u4e2a\u63a5\u53e3\u3002</p> <pre><code>#### \u8bbf\u95eelogin\u63a5\u53e3\u7684HTTP\u8bf7\u6c42\u548c\u54cd\u5e94\n\n#Request\nPOST http://localhost:9090/api/user-service/v1/user/login\n\nContent-Type: application/x-www-form-urlencoded\n\nuserName=admin&amp;password=test\n\n#Response\n{\n \"id\": 0,\n \"sessiondId\": \"1be646c0-50cb-4c0a-968d-2a512775f5e8\",\n \"userName\": \"guest\",\n \"roleName\": \"guest\",\n \"creationTime\": null,\n \"activeTime\": null\n}\n</code></pre>"},{"location":"featured-topics/application-porter/user-story.html","title":"User Story","text":"<p>\u5f00\u59cb\u524d\uff0c\u7ed9\u5e94\u7528\u53d6\u4e00\u4e2a\u540d\u5b57 <code>porter</code>\u3002 </p> <p><code>porter</code> \u5e94\u7528\u4e3b\u8981\u5b9e\u73b0\u5982\u4e0b\u51e0\u4e2a\u7528\u6237\u6545\u4e8b\uff1a</p> <ul> <li>\u8f93\u5165\u7528\u6237\u540d\u3001\u5bc6\u7801\u767b\u5f55\u7cfb\u7edf\u3002</li> <li>\u4e0a\u4f20\u6587\u4ef6\u5230\u7cfb\u7edf\u4e2d\u3002\u7cfb\u7edf\u4f1a\u68c0\u67e5\u7528\u6237\u7684\u6743\u9650\uff0c\u5982\u679c\u7528\u6237\u88ab\u6388\u6743\uff0c\u6587\u4ef6\u4e0a\u4f20\u6210\u529f\u5e76\u8fd4\u56de\u6587\u4ef6\u6807\u8bc6\uff1b\u5982\u679c\u7528\u6237\u672a\u88ab\u6388\u6743\uff0c\u5219\u8fd4\u56de\u9519\u8bef\u3002</li> <li>\u5220\u9664\u6587\u4ef6\u3002\u8f93\u5165\u6587\u4ef6\u6807\u8bc6\u5220\u9664\u6587\u4ef6\u3002\u5220\u9664\u6587\u4ef6\u4e5f\u4f1a\u68c0\u67e5\u7528\u6237\u662f\u5426\u88ab\u6388\u6743\u3002</li> </ul>"},{"location":"featured-topics/features/date-time.html","title":"\u7279\u6027\u4ecb\u7ecd\uff1a date\u548cdate-time","text":"<p>OpenAPI \u9488\u5bf9\u65f6\u95f4\u5b9a\u4e49\u4e86\u4e24\u79cd\u7c7b\u578b date \u548c date-time\u3002</p>"},{"location":"featured-topics/features/date-time.html#date","title":"\u4f7f\u7528 date","text":"<p>\u53ef\u4ee5\u5728 query, path, body \u7b49\u53c2\u6570\u4e2d\u4f7f\u7528 date \u7c7b\u578b\u3002 date \u7c7b\u578b\u5bf9\u5e94\u7684 Java \u7c7b\u578b\u4e3a <code>java.time.LocalDate</code>\u3002 \u4f7f\u7528 Spring MVC\uff0c \u5206\u522b\u91c7\u7528\u5982\u4e0b\u65b9\u5f0f\u5b9a\u4e49\u63a5\u53e3\uff1a</p> <pre><code>@GetMapping(path = \"/getLocalDate\")\npublic LocalDate getLocalDate(@RequestParam(\"date\") LocalDate date) {\nreturn date;\n}\n\n@GetMapping(path = \"/getLocalDate/{date}\")\npublic LocalDate getLocalDatePath(@PathParam(\"date\") LocalDate date) {\nreturn date;\n}\n\n@PostMapping(path = \"/postLocalDate\")\npublic LocalDate postLocalDate(@RequestBody LocalDate date) {\nreturn date;\n}\n</code></pre> <p>\u5176\u4e2d <code>getLocalDatePath</code> \u63a5\u53e3\u5b9a\u4e49\u751f\u6210\u7684 swagger \u63cf\u8ff0\u5982\u4e0b\uff1a</p> <pre><code>/getLocalDate/{date}:\nget:\n operationId: \"getLocalDatePath\"\n parameters:\n - name: \"date\"\n in: \"path\"\n required: true\n type: \"string\"\n format: \"date\"\n responses:\n \"200\":\n description: \"response of 200\"\n schema:\n type: \"string\"\n format: \"date\"\n</code></pre> <p>\u53ef\u4ee5\u770b\u51fa\uff0cdate \u5728\u7f51\u7edc\u4e0a\u662f\u901a\u8fc7 String \u8fdb\u884c\u7f16\u7801\u8fdb\u884c\u4f20\u8f93\u7684\uff0c \u683c\u5f0f\u662f\u6807\u51c6\u7684\u683c\u5f0f\uff0c \u6bd4\u5982 <code>2020-02-20</code>\u3002</p>"},{"location":"featured-topics/features/date-time.html#date-time","title":"\u4f7f\u7528 date-time","text":"<p>\u53ef\u4ee5\u5728 query, path, body \u7b49\u53c2\u6570\u4e2d\u4f7f\u7528 date-time \u7c7b\u578b\u3002 date \u7c7b\u578b\u5bf9\u5e94\u7684 Java \u7c7b\u578b\u4e3a <code>java.time.LocalDateTime</code>\uff0c \u6216\u8005 <code>java.util.Date</code> \u3002 \u4f7f\u7528 Spring MVC\uff0c \u5206\u522b\u91c7\u7528\u5982\u4e0b\u65b9\u5f0f\u5b9a\u4e49\u63a5\u53e3\uff1a</p> <pre><code>@GetMapping(path = \"/getDate\")\npublic Date getDate(@RequestParam(\"date\") Date date) {\nreturn date;\n}\n\n@GetMapping(path = \"/getDatePath/{date}\")\npublic Date getDatePath(@PathParam(\"date\") Date date) {\nreturn date;\n}\n\n@PostMapping(path = \"/postDate\")\npublic Date postDate(@RequestBody Date date) {\nreturn date;\n}\n\n@GetMapping(path = \"/getLocalDateTime\")\npublic LocalDateTime getLocalDateTime(@RequestParam(\"date\") LocalDateTime date) {\nreturn date;\n}\n\n@GetMapping(path = \"/getLocalDateTime/{date}\")\npublic LocalDateTime getLocalDateTimePath(@PathParam(\"date\") LocalDateTime date) {\nreturn date;\n}\n\n@PostMapping(path = \"/postLocalDateTime\")\npublic LocalDateTime postLocalDateTime(@RequestBody LocalDateTime date) {\nreturn date;\n}\n</code></pre> <p>\u5176\u4e2d <code>getLocalDateTimePath</code> \u63a5\u53e3\u5b9a\u4e49\u751f\u6210\u7684 swagger \u63cf\u8ff0\u5982\u4e0b\uff1a</p> <pre><code>/getLocalDateTime/{date}:\nget:\n operationId: \"getLocalDateTimePath\"\n parameters:\n - name: \"date\"\n in: \"path\"\n required: true\n type: \"string\"\n format: \"date-time\"\n responses:\n \"200\":\n description: \"response of 200\"\n schema:\n type: \"string\"\n format: \"date-time\"\n</code></pre> <p>\u53ef\u4ee5\u770b\u51fa\uff0cdate-time \u5728\u7f51\u7edc\u4e0a\u662f\u901a\u8fc7 String \u8fdb\u884c\u7f16\u7801\u8fdb\u884c\u4f20\u8f93\u7684\uff0c \u683c\u5f0f\u662f\u6807\u51c6\u7684\u683c\u5f0f\uff0c \u6bd4\u5982 <code>2017-07-21T17:32:28Z</code>\u3002 \u7531\u4e8e date-time \u7684\u6807\u51c6\u683c\u5f0f\u5305\u542b\u7279\u6b8a\u5b57\u7b26\uff0c\u5728\u4f5c\u4e3a query \u6216\u8005 path \u53c2\u6570\u7684\u65f6\u5019\uff0c \u9700\u8981\u505a\u597d URL \u7f16\u89e3\u7801\uff0c \u7f51\u7edc\u4e0a\u4f20\u9012\u7684\u5b9e\u9645\u5185\u5bb9\u4e3a <code>2017-07-21T17%3A32%3A28Z</code>\uff0c \u6bd4\u5982\uff1a <code>http://localhost:8082/dateTime/getLocalDateTime?date=2017-07-21T17%3A32%3A28Z</code>, \u4f5c\u4e3a body \u53c2\u6570\uff0c \u5185\u5bb9\u4e0d\u4f1a\u7f16\u89e3\u7801\uff0c \u662f\u5f15\u53f7\u5305\u542b\u8d77\u6765\u7684 String \u7c7b\u578b\uff0c \u6bd4\u5982 <code>\"2017-07-21T17:32:28Z\"</code>\u3002</p>"},{"location":"featured-topics/features/http-dispatcher.html","title":"\u7279\u6027\u4ecb\u7ecd\uff1a Edge Service \u901a\u7528\u7684 HTTP \u8f6c\u53d1\u5668 CommonHttpEdgeDispatcher","text":"<p>Edge Service \u63d0\u4f9b\u4e86\u975e\u5e38\u4e30\u5bcc\u7684 HTTP \u8f6c\u53d1\u5668\uff0c\u5e76\u652f\u6301\u81ea\u5b9a\u4e49\u6269\u5c55\u3002\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\uff0c\u53ef\u80fd\u5b58\u5728\u4e0d\u540c\u5f00\u53d1\u6846\u67b6\u5e76\u5b58\u7684\u60c5\u51b5\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u9057\u7559\u5e94\u7528 \u7cfb\u7edf\uff0c\u6216\u8005\u9700\u8981\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230\u5176\u4ed6\u7b2c\u4e09\u65b9\u7cfb\u7edf\u7684\u573a\u666f\u3002 Java Chassis\u63d0\u4f9b\u4e86 CommonHttpEdgeDispatcher \u652f\u6301\u8fd9\u4e9b\u573a\u666f\u3002 </p> <p>CommonHttpEdgeDispatcher \u8981\u6c42\u76ee\u6807\u5fae\u670d\u52a1\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\uff0c\u80fd\u591f\u88ab\u81ea\u52a8\u53d1\u73b0\u3002\u65b0\u7684\u8f6c\u53d1\u5668\u53ef\u4ee5\u7ba1\u7406\u5b9e\u4f8b\u72b6\u6001\uff0c\u63d0\u4f9b\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u914d\u7f6e\uff0c \u63d0\u4f9b\u5b9e\u4f8b\u9694\u79bb\u7b49\u57fa\u672c\u6cbb\u7406\u529f\u80fd\u3002 </p> <p>CommonHttpEdgeDispatcher \u80fd\u591f\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230\u76d1\u542c HTTP \u6216\u8005 HTTP 2 \u534f\u8bae\u7684 Provider\uff0c \u5bf9\u4e8e Provider \u7684\u5f00\u53d1\u6846\u67b6\u6ca1\u6709\u9650\u5236\uff0c\u4e5f\u4e0d \u8981\u6c42 Provider \u6ce8\u518c\u5951\u7ea6\u4fe1\u606f\u3002 </p>"},{"location":"featured-topics/features/http-dispatcher.html#commonhttpedgedispatcher","title":"\u4f7f\u7528 CommonHttpEdgeDispatcher","text":"<p>\u5728 Edge Service \u542f\u7528 CommonHttpEdgeDispatcher \u975e\u5e38\u7b80\u5355\uff0c \u53ea\u9700\u8981\u5728 <code>microservice.yaml</code> \u4e2d\u589e\u52a0\u4e0b\u9762\u7684\u914d\u7f6e\u3002 </p> <pre><code>servicecomb:\n http:\n dispatcher:\n http:\n enabled: true\n mappings:\n businessV2:\n prefixSegmentCount: 1\n path: \"/http/business/v2/.*\"\n microserviceName: business\n versionRule: 2.0.0\n businessV1:\n prefixSegmentCount: 1\n path: \"/http/business/v1/add.*\"\n microserviceName: business\n versionRule: 1.0.0-1.2.0\n businessV1_1:\n prefixSegmentCount: 1\n path: \"/http/business/v1/dec.*\"\n microserviceName: business\n versionRule: 1.1.0\n</code></pre> <p>\u901a\u7528\u7684 HTTP \u8f6c\u53d1\u5668\u7684\u914d\u7f6e\u9879\u548c <code>URLMappedEdgeDispatcher</code> \u975e\u5e38\u7c7b\u4f3c\u3002 \u53ef\u4ee5\u914d\u7f6e\u4e00\u7cfb\u5217\u7684 mappings \u5b9a\u4e49 URL \u4e0e \u5fae\u670d\u52a1\u4e4b\u95f4\u7684\u8f6c\u53d1\u5173\u7cfb\u3002 \u4e0a\u8ff0\u914d\u7f6e\u5b9a\u4e49\u4e86 3 \u4e2a mappings\uff0c \u7b2c 1 \u4e2a\u5c06 URL \u6ee1\u8db3 <code>/http/business/v2/.*</code> \u7684\u8bf7\u6c42 \u8f6c\u53d1\u5230 business \u670d\u52a1 2.0.0 \u7248\u672c\u5b9e\u4f8b\uff0c \u540e\u7aef\u670d\u52a1\u5b9e\u9645\u7684 URL \u4e3a <code>/business/v2/.*</code> \u3002 \u7b2c 2 \u4e2a\u6f14\u793a\u4e86\u7070\u5ea6\u8f6c\u53d1\uff0c \u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230 1.0.0 \u4ee5\u4e0a\uff08\u542b\uff09\uff0c 1.2.0 \u4ee5\u4e0b\uff08\u4e0d\u542b\uff09 \u7684\u7248\u672c\u3002 </p>"},{"location":"featured-topics/features/http-dispatcher.html#commonhttpedgedispatcher_1","title":"CommonHttpEdgeDispatcher \u7684\u6cbb\u7406","text":"<p>CommonHttpEdgeDispatcher \u96c6\u6210\u4e86 loadbalance \u6a21\u5757\u63d0\u4f9b\u7684\u6cbb\u7406\u80fd\u529b\uff0c \u5728 \u8d1f\u8f7d\u5747\u8861 \u91cc\u9762\u7684\u6cbb\u7406 \u80fd\u529b\u90fd\u53ef\u4ee5\u4f7f\u7528\uff0c\u9664\u4e86 <code>\u8bbe\u7f6e\u91cd\u8bd5\u7b56\u7565</code> \u3002 \u8fd9\u4e2a\u8f6c\u53d1\u5668\u901a\u5e38\u88ab\u7528\u4e8e\u8f6c\u53d1 UI \u8bf7\u6c42\u5230\u540e\u7aef\u7684\u9759\u6001\u9875\u9762\u670d\u52a1\uff0c\u4ee5\u53ca\u9057\u7559\u7684\u4f7f\u7528 spring boot \u5f00\u53d1\u7684\u5fae\u670d\u52a1\uff0c \u6216\u8005\u91c7\u7528 spring-cloud-huawei \u63a5\u5165\u670d\u52a1\u4e2d\u5fc3\u7684 spring cloud \u5fae\u670d\u52a1\u5e94\u7528\u3002 </p>"},{"location":"featured-topics/secrets/api-first.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u5951\u7ea6\u4f18\u5148\uff08API First\uff09\u5f00\u53d1","text":"<p>\u5951\u7ea6\u4f18\u5148\uff08API First\uff09\u5f00\u53d1\u662f\u6307\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u5c06API\u8bbe\u8ba1\u4f5c\u4e3a\u7b2c\u4e00\u4f18\u5148\u7ea7\u7684\u4efb\u52a1\u3002\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u968f\u7740Web Services\u6982\u5ff5\u7684\u53d1\u5c55\u800c\u4e0d\u65ad\u5f97\u5230\u91cd\u89c6\uff0c\u7279\u522b\u662f\u5fae\u670d\u52a1\u67b6\u6784\u51fa\u73b0\u4ee5\u540e\uff0cAPI\u8bbe\u8ba1\u6210\u4e3a\u5f71\u54cd\u529f\u80fd\u5f00\u653e\u3001\u6027\u80fd\u4f18\u5316\u7b49\u95ee\u9898\u7684\u5173\u952e\u56e0\u7d20\u3002\u5e38\u89c1\u7684\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u6846\u67b6\u548c\u6a21\u5f0f\u6709\u5982\u4e0b\u51e0\u79cd\uff1a</p> <ul> <li>Web Services\u6280\u672f\u53ef\u4ee5\u7531\u8bbe\u8ba1\u4eba\u5458\u5148\u7f16\u5199WSDL\u63cf\u8ff0WEB\u670d\u52a1\u5185\u5bb9\uff0c\u7136\u540e\u7ed3\u5408\u5de5\u5177\u751f\u6210\u4ee3\u7801\u3002WSDL\u53ef\u4ee5\u8fdb\u884c\u5206\u53d1\uff0c\u4e0d\u540c\u7684\u8bed\u8a00\u90fd\u53ef\u4ee5\u7ed3\u5408WSDL\u751f\u6210\u5ba2\u6237\u7aef\u3002</li> <li>gRPC\u6280\u672f\u53ef\u4ee5\u7531\u8bbe\u8ba1\u4eba\u5458\u5148\u7f16\u5199IDL\u63cf\u8ff0RPC\u670d\u52a1\u5185\u5bb9\uff0c\u7136\u540e\u7ed3\u5408\u5de5\u5177\u751f\u6210\u4ee3\u7801\u3002gRPC\u4e3b\u8981\u89e3\u51b3\u670d\u52a1\u5185\u90e8\u4e4b\u95f4\u7684\u8c03\u7528\u3002</li> <li>Spring Boot\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u5229\u7528swagger\u5de5\u5177\uff0c\u5148\u7f16\u5199Open API\u63a5\u53e3\uff0c\u7136\u540e\u901a\u8fc7\u5de5\u5177\u751f\u6210RESTFul\u7684\u670d\u52a1\u7aef\u4ee3\u7801\u3002</li> </ul> <p>\u8fd9\u4e9b\u6280\u672f\u90fd\u8981\u6c42\u8bbe\u8ba1\u4eba\u5458\u638c\u63e1\u4e00\u79cd\u8bed\u8a00\u65e0\u5173\u7684\u63cf\u8ff0\u8bed\u8a00\uff08WSDL\u3001IDL\u3001Swagger\u7b49\uff09\uff0c\u5e76\u4e14\u901a\u8fc7\u5de5\u5177\u751f\u6210\u5177\u4f53\u8bed\u8a00\u7684\u4ee3\u7801\u3002\u5b83\u4eec\u652f\u6301\u7684\u5e94\u7528\u573a\u666f\u4e5f\u6709\u6240\u5dee\u5f02\uff0cWeb Service\u9002\u5408\u5bf9\u5916\u7684WEB\u670d\u52a1\uff0cgRPC\u9002\u5408\u5bf9\u5185\u7684RPC\u670d\u52a1\u3002Java Chassis\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u5177\u5907\u4e0b\u9762\u7684\u51e0\u4e2a\u6539\u8fdb\uff1a</p> <ul> <li>\u5141\u8bb8\u76f4\u63a5\u4f7f\u7528Java\u8bed\u8a00\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u8005\u638c\u63e1\u65b0\u7684\u63cf\u8ff0\u8bed\u8a00\u3002</li> <li>\u540c\u65f6\u5b9a\u4e49Web\u670d\u52a1\u63a5\u53e3\u548c\u5185\u90e8RPC\u63a5\u53e3\u3002</li> </ul> <p>\u548cSpring Boot\u4e00\u6837\uff0c Java Chassis\u7684\u8bed\u8a00\u65e0\u5173\u6027\u63cf\u8ff0\u8bed\u8a00\u4ecd\u7136\u662fOpen API\uff0c\u901a\u8fc7Open API\uff0c\u53ef\u4ee5\u6ee1\u8db3\u8de8\u8bed\u8a00\u548c\u670d\u52a1\u5206\u53d1\u7684\u8981\u6c42\u3002</p>"},{"location":"featured-topics/secrets/api-first.html#_1","title":"\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u7684\u8fc7\u7a0b","text":"<p>\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u53ef\u4ee5\u6db5\u76d6\u8bbe\u8ba1\u3001\u5f00\u53d1\u3001\u6d4b\u8bd5\u3001\u90e8\u7f72\u3001\u8fd0\u7ef4\u7b49\u8f6f\u4ef6\u5f00\u53d1\u7684\u5168\u6d41\u7a0b\uff0c\u901a\u8fc7\u5951\u7ea6\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u73af\u8282\u7684\u5e76\u884c\u5de5\u4f5c\uff0c\u4ece\u800c\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3002 \u4e00\u4e2a\u7b80\u5355\u7684\u5951\u7ea6\u5f00\u53d1\u8fc7\u7a0b\u5982\u4e0b\uff1a</p> <p></p> <p>\u4e0b\u9762\u901a\u8fc7\u4ee3\u7801\u7b80\u5355\u5c55\u793a\u901a\u8fc7Java\u8bed\u4e49\u5b9a\u4e49\u5951\u7ea6\uff0c\u5e76\u5b9e\u73b0\u63d0\u4f9b\u8005\u548c\u6d88\u8d39\u8005\u7684\u8fc7\u7a0b\u3002</p> <ul> <li>\u5b9a\u4e49\u670d\u52a1\u5951\u7ea6</li> </ul> <pre><code>@RequestMapping(path = \"/provider\")\npublic interface ProviderService {\n @GetMapping(\"/sayHello\")\n String sayHello(@RequestParam(\"name\") String name);\n}\n</code></pre> <ul> <li>\u5b9a\u4e49\u63d0\u4f9b\u8005</li> </ul> <pre><code>@RestSchema(schemaId = \"ProviderController\", schemaInterface = ProviderService.class)\npublic class ProviderController implements ProviderService {\n @Override\n public String sayHello(String name) {\n return \"Hello \" + name;\n }\n}\n</code></pre> <ul> <li>\u5b9a\u4e49\u6d88\u8d39\u8005</li> </ul> <pre><code>@Configuration\npublic class ProviderServiceConfiguration {\n @Bean\n public ProviderService providerService() {\n return Invoker.createProxy(\"provider\", \"ProviderController\", ProviderService.class);\n }\n}\n</code></pre> <p>\u4f7f\u7528RPC\u65b9\u5f0f\u8bbf\u95ee\u63d0\u4f9b\u8005\u3002</p> <pre><code>@RestSchema(schemaId = \"ConsumerController\", schemaInterface = ConsumerService.class)\npublic class ConsumerController implements ConsumerService {\n private ProviderService providerService;\n\n @Autowired\n public void setProviderService(ProviderService providerService) {\n this.providerService = providerService;\n }\n\n @Override\n public String sayHello(String name) {\n return providerService.sayHello(name);\n }\n}\n</code></pre> <ul> <li>\u670d\u52a1\u5206\u53d1\u548cWeb\u670d\u52a1\u8bbf\u95ee</li> </ul> <p>\u63d0\u4f9b\u8005\u7684\u670d\u52a1\u5b9a\u4e49\u4f1a\u751f\u6210\u5982\u4e0bOpen API\u4fe1\u606f</p> <pre><code>openapi: 3.0.1\ninfo:\n title: swagger definition for org.apache.servicecomb.samples.api.ProviderService\n version: 1.0.0\nservers:\n- url: /provider\npaths:\n /sayHello:\n get:\n operationId: sayHello\n parameters:\n - name: name\n in: query\n required: true\n schema:\n type: string\n responses:\n \"200\":\n description: response of 200\n content:\n application/json:\n schema:\n type: string\n application/protobuf:\n schema:\n type: string\n text/plain:\n schema:\n type: string\ncomponents: {}\n</code></pre> <p>\u8fd9\u4e2a\u4fe1\u606f\u53ef\u4ee5\u7528\u4e8eWEB\u670d\u52a1\u8bbf\u95ee\uff0c\u6bd4\u5982\u4e0a\u9762\u7684\u4fe1\u606f\u53ef\u4ee5\u4f7f\u7528</p> <pre><code>GET /providers/sayHello?name=World\n</code></pre> <p>\u7684HTTP\u8bf7\u6c42\u6765\u8bbf\u95ee\u3002 \u5bf9\u4e8e\u5176\u4ed6\u6846\u67b6\u6216\u8005\u8bed\u8a00\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528Open API\u751f\u6210\u5bf9\u5e94\u7684\u4ee3\u7801\u6765\u8bbf\u95ee\u3002 </p>"},{"location":"featured-topics/secrets/api-first.html#_2","title":"\u670d\u52a1\u6cbb\u7406","text":"<p>\u670d\u52a1\u6cbb\u7406\u88ab\u8bbe\u8ba1\u4e3a\u72ec\u7acb\u4e8e\u5f00\u53d1\u8fc7\u7a0b\uff0c\u7ed3\u5408Open API\u548c\u670d\u52a1\u6cbb\u7406\u89c4\u5219\u63cf\u8ff0\u8bed\u8a00\uff0c\u80fd\u591f\u5bf9API\u8fdb\u884c\u670d\u52a1\u6cbb\u7406\u914d\u7f6e\u3002</p> <pre><code>servicecomb:\n matchGroup:\n helloOperation: |\n matches:\n - apiPath:\n prefix: \"/provider/sayHello\"\n rateLimiting:\n ## \u9650\u6d41\u5668\u6bcf10\u6beb\u79d2\u5141\u8bb8\u901a\u8fc7100\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\n helloOperation: |\n rate: 100\n limitRefreshPeriod: 10\n timeoutDuration: 1000\n</code></pre> <p>\u4e0a\u8ff0\u89c4\u5219\u5bf9API\u63a5\u53e3\u8fdb\u884c\u9650\u6d41\u63a7\u5236\u3002 </p>"},{"location":"featured-topics/secrets/api-first.html#_3","title":"\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u7684\u5176\u4ed6\u65b9\u9762","text":"<p>\u6d4b\u8bd5\u65b9\u9762\uff0c\u53ef\u4ee5\u901a\u8fc7\u5951\u7ea6\u751f\u6210\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\uff0c\u4ee5\u8986\u76d6API\u7684\u6d4b\u8bd5\u3002 \u90e8\u7f72\u5b9e\u65bd\u65b9\u9762\uff0c\u53ef\u4ee5\u5c06Open API\u4fe1\u606f\u5bfc\u5165\u7f51\u5173\uff0c\u5b9e\u73b0API\u80fd\u529b\u5f00\u653e\u3001\u8ba4\u8bc1\u9274\u6743\u3001\u8ba1\u8d39\u7b49\u3002 \u6b64\u5916\uff0c\u5951\u7ea6\u8fd8\u53ef\u4ee5\u7528\u4e8e\u6587\u6863\u751f\u6210\u3001\u5e94\u7528\u76d1\u63a7\u7edf\u8ba1\u7b49\u5404\u4e2a\u65b9\u9762\u3002</p>"},{"location":"featured-topics/secrets/api-first.html#_4","title":"\u603b\u7ed3","text":"<p>Java Chassis\u57fa\u4e8eJAVA\u8bed\u8a00\u7684\u63a5\u53e3\u5b9a\u4e49\uff0c\u53ef\u4ee5\u540c\u65f6\u6ee1\u8db3Native\u8bed\u8a00\u548c\u5e73\u53f0\u65e0\u5173\u63cf\u8ff0\u8bed\u8a00\u4e24\u79cd\u60c5\u51b5\u7684SDK\u5206\u53d1\uff0c\u5e76\u4e14\u4e0d\u9700\u8981\u4f7f\u7528\u5de5\u5177\u751f\u6210\u989d\u5916\u7684\u8fd0\u884c\u4ee3\u7801\uff0c\u7ed9\u5916\u90e8\u670d\u52a1\u5f00\u53d1\u548c\u5185\u90e8\u670d\u52a1\u5f00\u53d1\u63d0\u4f9b\u4e86\u7edf\u4e00\u4e00\u81f4\u7684\u5f00\u53d1\u4f53\u9a8c\u3002 \u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u662f\u9762\u5411\u670d\u52a1\u5316/\u5fae\u670d\u52a1\u5316\u975e\u5e38\u9ad8\u6548\u7684\u8fc7\u7a0b\u65b9\u6cd5\uff0cJava Chassis\u7ed9\u652f\u6301\u5951\u7ea6\u4f18\u5148\u5f00\u53d1\u63d0\u4f9b\u4e86\u5f88\u597d\u7684\u5de5\u5177\u652f\u6301\u3002 </p>"},{"location":"featured-topics/secrets/applied-config.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u5e94\u7528\u89c6\u89d2\u7684\u914d\u7f6e\u7ba1\u7406","text":"<p>\u8c08\u8bba\u5fae\u670d\u52a1\u914d\u7f6e\u7ba1\u7406\u7684\u65f6\u5019\uff0c\u6700\u591a\u7684\u662f\u4ee5\u914d\u7f6e\u4e2d\u5fc3\u4e3a\u89c6\u89d2\uff0c\u8ba8\u8bba\u5176\u914d\u7f6e\u7ba1\u7406\u80fd\u529b\u3002 \u548c\u6ce8\u518c\u4e2d\u5fc3\u4e00\u6837\uff0c\u4e0d\u540c\u7684\u914d\u7f6e\u4e2d\u5fc3\u4f1a\u6709\u4e00\u4e9b\u5173\u952e\u7684\u8bbe\u8ba1\u6307\u6807\u3002 </p> <ul> <li>\u914d\u7f6e\u7684\u683c\u5f0f\u548c\u7c7b\u578b\u3002\u652f\u6301\u4e0d\u540c\u683c\u5f0f\u548c\u7c7b\u578b\u7684\u914d\u7f6e\u9879\uff0c\u6bd4\u5982YAML\u3001\u6587\u672c\u3001JSON\u3001XML\u7b49\u3002</li> <li>\u914d\u7f6e\u7684\u903b\u8f91\u5c42\u6b21\u3002\u6bd4\u5982 Kie \u63d0\u4f9b\u4e86 Label \u6765\u8868\u8fbe\u914d\u7f6e\u7684\u5c42\u6b21\uff0c\u53ef\u4ee5\u7b80\u5316\u4e3a\u5e94\u7528\u914d\u7f6e\u3001\u670d\u52a1\u914d\u7f6e\u548c\u81ea\u5b9a\u4e49\u914d\u7f6e\u7b49\uff1bNacos \u4f7f\u7528 Namespace\u3001Group\u7b49\u6982\u5ff5\u6765\u8868\u8fbe\u914d\u7f6e\u7684\u5c42\u6b21\u3002 </li> <li>\u53d8\u66f4\u901a\u77e5\u673a\u5236\u3002\u548c\u6ce8\u518c\u4e2d\u5fc3\u4e00\u6837\uff0c\u914d\u7f6e\u4e2d\u5fc3\u4e5f\u6709\u53d8\u66f4\u901a\u77e5\u673a\u5236\uff0c\u4e24\u8005\u7684\u673a\u5236\u76f8\u4f3c\u3002\u76f8\u8f83\u800c\u8a00\uff0c\u914d\u7f6e\u4e2d\u5fc3\u5bf9\u4e8e\u53d8\u66f4\u611f\u77e5\u5468\u671f\u7684\u7684\u8981\u6c42\u66f4\u4f4e\u3002</li> <li>\u914d\u7f6e\u5386\u53f2\u548c\u63a8\u9001\u8f68\u8ff9\u3002\u901a\u8fc7\u914d\u7f6e\u5386\u53f2\uff0c\u80fd\u591f\u4e86\u89e3\u914d\u7f6e\u9879\u7684\u6539\u52a8\u8bb0\u5f55\uff0c\u65b9\u4fbf\u8fdb\u884c\u5ba1\u8ba1\u548c\u56de\u9000\uff0c\u63a8\u9001\u8f68\u8ff9\u5219\u5e2e\u52a9\u4e86\u89e3\u914d\u7f6e\u9879\u88ab\u5e94\u7528\u5230\u4e86\u54ea\u4e9b\u5fae\u670d\u52a1\u3002 </li> </ul> <p>Java Chassis 3\u7684\u8bbe\u8ba1\u76ee\u6807\u4e4b\u4e00\uff0c\u5c31\u662f\u4ee5\u5e94\u7528\u7684\u89c6\u89d2\uff0c\u652f\u6301\u4e0d\u540c\u7684\u914d\u7f6e\u4e2d\u5fc3\uff0c\u5e76\u63d0\u4f9b\u7edf\u4e00\u4e00\u81f4\u7684\u4f7f\u7528\u65b9\u5f0f\u3002</p> <p>Java Chassis 3\u7b80\u5316\u4e86\u5fae\u670d\u52a1\u5b9a\u4e49\uff0c\u53ea\u5305\u542b\u5982\u4e0b\u6838\u5fc3\u6982\u5ff5\uff1a</p> <ul> <li>\u73af\u5883\u540d\u79f0\uff1a\u7528\u4e8e\u8868\u793a\u90e8\u7f72\u73af\u5883\uff0c\u4e0d\u540c\u73af\u5883\u7684\u5fae\u670d\u52a1\u4e4b\u95f4\u4e0d\u80fd\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u3002\u5bf9\u4e8e\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\uff0c\u4f1a\u4ee5\u5bf9\u5e94\u7684\u6982\u5ff5\u8868\u793a\u73af\u5883\u3002\u6bd4\u5982Nacos\u4f7f\u7528 <code>namespace</code> \u6765\u8868\u793a\u73af\u5883\u3002</li> <li>\u5e94\u7528\u540d\u79f0\uff1a\u7528\u4e8e\u63cf\u8ff0\u4e00\u7ec4\u53ef\u4ee5\u76f8\u4e92\u8bbf\u95ee\u7684\u5fae\u670d\u52a1\uff0c\u4e0d\u540c\u5e94\u7528\u540d\u79f0\u4e4b\u95f4\u662f\u903b\u8f91\u9694\u79bb\u7684\uff0c\u4e0d\u80fd\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u3002\u5bf9\u4e8e\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\uff0c\u4f1a\u4ee5\u5bf9\u5e94\u7684\u6982\u5ff5\u8868\u793a\u5e94\u7528\u3002\u6bd4\u5982Nacos\u4f7f\u7528 <code>group</code> \u6765\u8868\u793a\u5e94\u7528\u3002</li> <li>\u5fae\u670d\u52a1\u540d\u79f0\uff1a\u7528\u4e8e\u6807\u8bc6\u4e00\u4e2a\u5fae\u670d\u52a1\u3002\u53ef\u4ee5\u901a\u8fc7\u5fae\u670d\u52a1\u540d\u79f0\u67e5\u8be2\u9700\u8981\u8bbf\u95ee\u7684\u76ee\u6807\u5fae\u670d\u52a1\u3002</li> <li>\u5fae\u670d\u52a1\u7248\u672c\uff1a\u8868\u793a\u5fae\u670d\u52a1\u7684\u7248\u672c\u3002\u5f53\u5b58\u5728\u5fae\u670d\u52a1\u5c5e\u6027\u53d8\u5316\u3001\u63a5\u53e3\u53d8\u5316\u7684\u573a\u666f\uff0c\u5efa\u8bae\u4fee\u6539\u7248\u672c\u53f7\u3002</li> <li>\u5fae\u670d\u52a1\u63cf\u8ff0\uff1a\u7b80\u5355\u7684\u5fae\u670d\u52a1\u63cf\u8ff0\u4fe1\u606f\u3002</li> <li>\u5fae\u670d\u52a1\u5c5e\u6027\uff1a\u7528\u4e8e\u63cf\u8ff0\u5fae\u670d\u52a1\u7684\u6269\u5c55\u4fe1\u606f\u3002</li> </ul> <pre><code>servicecomb:\n service:\n application: hello-applicaton\n name: hello-service\n version: 0.0.1 \n properties: \n key1: value1\n key2: value2\n description: This is a description about the microservice\n environment: production\n</code></pre> <p>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1\u63a5\u5165\u914d\u7f6e\u4e2d\u5fc3\u4ee5\u540e\uff0cJava Chassis 3\u7684\u914d\u7f6e\u7ba1\u7406\u6a21\u5757\uff0c\u4f1a\u81ea\u52a8\u4ece\u914d\u7f6e\u4e2d\u5fc3\u83b7\u53d6\u5982\u4e0b\u914d\u7f6e\u5c42\u6b21\u7684\u914d\u7f6e\u4fe1\u606f\uff1a</p> <ul> <li>\u5e94\u7528\u914d\u7f6e\u3002</li> <li>\u670d\u52a1\u914d\u7f6e\u3002</li> <li>\u7248\u672c\u914d\u7f6e\u3002</li> <li>\u81ea\u5b9a\u4e49\u914d\u7f6e\u3002</li> </ul> <p>\u8fd9\u4e9b\u914d\u7f6e\u5728\u4e0d\u540c\u914d\u7f6e\u4e2d\u5fc3\u7684\u5bf9\u5e94\u5173\u7cfb\uff1a</p> \u9879\u76ee Nacos \u914d\u7f6e\u4e2d\u5fc3 Kie \u914d\u7f6e\u4e2d\u5fc3 \u5907\u6ce8 \u5e94\u7528\u914d\u7f6e namespace=environment group=application dataId=application environment=environment app=application \u670d\u52a1\u914d\u7f6e namespace=environment group=application dataId=service environment=environment app=application service=service \u7248\u672c\u914d\u7f6e namespace=environment group=application dataId=service-version environment=environment app=application service=service version=version \u81ea\u5b9a\u4e49\u914d\u7f6e namespace=environment group=group dataId=dataId customLabel=customLabelValue <p>\u4ee5\u5e94\u7528\u89c6\u89d2\u5efa\u7acb\u8fd9\u79cd\u5bf9\u5e94\u5173\u7cfb\u7684\u597d\u5904\uff0c\u662f\u7528\u6237\u4e0d\u9700\u8981\u81ea\u884c\u89c4\u5212\u5982\u4f55\u5728\u914d\u7f6e\u4e2d\u5fc3\u5b58\u653e\u6570\u636e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5c06\u4e00\u4e2a\u4f18\u79c0\u7684\u7ba1\u7406\u5b9e\u8df5\u5e94\u7528\u4e8e\u4e1a\u52a1\u573a\u666f\u3002\u5c06\u7528\u6237\u9700\u8981\u601d\u8003\u7684\u95ee\u9898\uff0c\u56fa\u5b9a\u4e3a\u51e0\u4e2a\u5177\u4f53\u7684\u95ee\u9898\uff1a\u5982\u4f55\u521b\u5efa\u5e94\u7528\u7ea7\u522b\u7684\u914d\u7f6e\uff1f\u5982\u4f55\u521b\u5efa\u670d\u52a1\u7ea7\u522b\u7684\u914d\u7f6e\uff1f\u5982\u4f55\u521b\u5efa\u5fae\u670d\u52a1\u81ea\u5b9a\u4e49\u7684\u914d\u7f6e\uff1f</p> <p>\u5e94\u7528\u89c6\u89d2\u7684\u914d\u7f6e\u7ba1\u7406\u53e6\u5916\u4e00\u4e2a\u5173\u952e\u95ee\u9898\uff0c\u662f\u5f00\u53d1\u8005\u5982\u4f55\u4f7f\u7528\u914d\u7f6e\u3002</p> <ul> <li>Spring Boot\u4f7f\u7528\u914d\u7f6e</li> </ul> <p>Spring Boot\u7684\u5f00\u53d1\u8005\u4e00\u822c\u901a\u8fc7 <code>@Value</code>\u3001<code>@ConfigurationProperties</code> \u548c <code>Environment</code> \u83b7\u53d6\u914d\u7f6e\u3002 \u5b83\u63d0\u4f9b\u4e86 <code>PropertySource</code> \u6765\u6269\u5c55\u914d\u7f6e\u6e90\u3002 Spring Boot\u5e76\u672a\u9488\u5bf9\u914d\u7f6e\u53d8\u66f4\u63d0\u4f9b\u989d\u5916\u7684\u5904\u7406\u673a\u5236\uff0c\u65e0\u6cd5\u5f88\u597d\u7684\u5904\u7406\u914d\u7f6e\u53d8\u66f4\u3002 \u5c3d\u7ba1\u5f53 <code>PropertySource</code> \u7684\u5185\u5bb9\u53d8\u5316\u540e\uff0c\u901a\u8fc7 <code>Environment</code> \u53ef\u4ee5\u83b7\u53d6\u5230\u6700\u65b0\u7684\u7248\u672c\u5185\u5bb9\uff0c\u4f46\u662f <code>@Value</code>\u3001<code>@ConfigurationProperties</code> \u5b9a\u4e49\u7684\u914d\u7f6e\u9879\u5219\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\u3002 </p> <ul> <li>Spring Cloud\u4f7f\u7528\u914d\u7f6e</li> </ul> <p>Spring Cloud\u5728Spring Boot\u57fa\u7840\u4e4b\u4e0a\uff0c\u63d0\u4f9b\u4e86\u52a8\u6001\u914d\u7f6e\u7684\u80fd\u529b\u3002 \u53ef\u4ee5\u4f7f\u7528 <code>@RefershScope</code> \u6807\u7b7e\u58f0\u660e Bean\uff0c \u5728\u914d\u7f6e\u53d8\u5316\u540e\uff0cSpring Cloud\u4f1a\u9500\u6bc1\u8001\u7684 Bean\uff0c \u5e76\u91cd\u5efa\u65b0\u7684 Bean\uff0c\u65b0\u7684 Bean\u4f1a\u4f7f\u7528\u6700\u65b0\u7684\u914d\u7f6e\u503c\u8fdb\u884c\u521d\u59cb\u5316\u3002 Spring Cloud\u5728\u5904\u7406\u914d\u7f6e\u53d8\u66f4\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u5bf9Bean\u7684\u8bbf\u95ee\u52a0\u8bfb\u5199\u9501\u3002 </p> <ul> <li>Java Chassis 3\u4f7f\u7528\u914d\u7f6e</li> </ul> <p>Java Chassis 3\u5b8c\u5168\u517c\u5bb9 Spring Boot\u7684\u914d\u7f6e\u4f7f\u7528\u65b9\u5f0f\u3002 \u5e76\u63d0\u4f9b\u4e86\u66f4\u52a0\u53cb\u597d\u7684 API \u76d1\u542c\u914d\u7f6e\u53d8\u66f4\u548c\u5904\u7406\u4f18\u5148\u7ea7\u914d\u7f6e\u3002 \u914d\u7f6e\u76d1\u542c API \u4e3b\u8981\u7528\u4e8e\u9ad8\u6027\u80fd\u573a\u666f\uff1a\u914d\u7f6e\u53d8\u66f4\u540e\u9700\u8981\u8fdb\u884c\u5fc5\u8981\u7684\u4e1a\u52a1\u903b\u8f91\u521d\u59cb\u5316\uff0c\u521d\u59cb\u5316\u53ef\u4ee5\u5728\u914d\u7f6e\u53d8\u66f4\u7ebf\u7a0b\u4e2d\u6267\u884c\uff0c\u800c\u4e0d\u963b\u585e\u5f53\u524d\u4e1a\u52a1\u6267\u884c\u3002 </p> <pre><code>@RestSchema(schemaId = \"ProviderController\")\n@RequestMapping(path = \"/\")\npublic class ProviderController {\n private DynamicProperties dynamicProperties;\n\n private String example;\n\n @Autowired\n public ProviderController(DynamicProperties dynamicProperties) {\n this.dynamicProperties = dynamicProperties;\n this.example = this.dynamicProperties.getStringProperty(\"basic.example\",\n value -&gt; this.example = value, \"not set\");\n }\n}\n</code></pre> <p>\u4f18\u5148\u7ea7\u914d\u7f6e\u662fJava Chassis3\u7279\u6709\u7684\u7ba1\u7406\u914d\u7f6e\u4f18\u5148\u7ea7\u65b9\u5f0f\u3002\u6bd4\u5982\u5bf9\u4e8e\u67d0\u4e2a\u65b9\u6cd5\uff0c\u4f1a\u8003\u8651\u662f\u5426\u6709\u5e94\u7528\u7ea7\u522b\u7684\u5168\u5c40\u914d\u7f6e\u3001\u9488\u5bf9\u670d\u52a1\u7684\u914d\u7f6e\u548c\u9488\u5bf9\u8fd9\u4e2a\u65b9\u6cd5\u7684\u914d\u7f6e\uff0c\u9488\u5bf9\u65b9\u6cd5\u7684\u914d\u7f6e\u4f18\u5148\u7ea7\u6700\u9ad8\u3002 \u8fd9\u79cd\u914d\u7f6e\u65b9\u5f0f\u88ab\u5e7f\u6cdb\u5e94\u7528\u4e8eJava Chassis 3\u7684\u9650\u6d41\u7b49\u670d\u52a1\u6cbb\u7406\u573a\u666f\u4e2d\u3002 \u4e0b\u9762\u7684\u4ee3\u7801\u7247\u6bb5\u662fJava Chassis\u7684\u63a5\u53e3\u8d85\u65f6\u914d\u7f6e\u793a\u4f8b\u3002</p> <pre><code>@InjectProperties(prefix = \"servicecomb\")\npublic class OperationConfig {\n public static final List&lt;String&gt; CONSUMER_OP_ANY_PRIORITY = Arrays.asList(\n \"${service}.${schema}.${operation}\",\n \"${service}.${schema}\",\n \"${service}\");\n\n /**\n * consumer request timeout\n */\n @InjectProperty(keys = {\"request.${op-any-priority}.timeout\", \"request.timeout\"}, defaultValue = \"30000\")\n private long msRequestTimeout;\n}\n</code></pre> <p>\u76f8\u5bf9\u4e8eSpring Cloud\uff0cJava Chassis3\u7684\u914d\u7f6eAPI\uff0c\u80fd\u591f\u66f4\u52a0\u65b9\u4fbf\u7684\u76d1\u542c\u914d\u7f6e\u53d8\u5316\uff0c\u5e76\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u6027\u80fd\u3002 </p> <p>\u5ba2\u6237\u6545\u4e8b\uff1aSpring Cloud\u914d\u7f6e\u53d8\u66f4\u4f1a\u52a0\u9501\u3002\u5728\u9ad8\u5e76\u53d1\u573a\u666f\uff0c\u914d\u7f6e\u53d8\u66f4\u4f1a\u963b\u585e\u6240\u6709\u8bf7\u6c42\u7684\u6267\u884c\u3002\u5982\u679c\u4e1a\u52a1\u6267\u884c\uff08\u5df2\u7ecf\u83b7\u53d6\u8bfb\u9501\uff09\u5305\u542bRPC\u7b49\u76f8\u5bf9\u6162\u7684\u903b\u8f91\uff0c\u914d\u7f6e\u53d8\u66f4\u7b49\u5f85\u5199\u9501\u4ee5\u53ca\u5176\u4ed6\u6267\u4e1a\u52a1\u7ebf\u7a0b\u7b49\u5f85\u8bfb\u9501\u90fd\u4f1a\u88ab\u963b\u585e\uff0c\u4ea7\u751f\u96ea\u5d29\u6548\u5e94\uff0c\u89e6\u53d1\u5e94\u7528\u541e\u5410\u6025\u5267\u4e0b\u964d\u3002Java Chassis 3\u914d\u7f6e\u53d8\u66f4\u4e0d\u963b\u585e\u4e1a\u52a1\u5904\u7406\uff0c\u80fd\u591f\u6709\u6548\u7684\u9632\u6b62\u914d\u7f6e\u53d8\u66f4\u89e6\u53d1\u96ea\u5d29\u6548\u5e94\uff0c\u7279\u522b\u662f\u5728\u9ad8\u5e76\u53d1\u3001\u9700\u8981\u52a8\u6001\u8c03\u6574\u8fd0\u884c\u3001\u6cbb\u7406\u89c4\u5219\u7684\u4e1a\u52a1\u573a\u666f\u3002 </p>"},{"location":"featured-topics/secrets/circuit-breaker.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u7194\u65ad\u673a\u5236\u7684\u6539\u8fdb\u8def\u7a0b","text":"<p>\u7194\u65ad\u673a\u5236\u662f\u5fae\u670d\u52a1\u6cbb\u7406\u975e\u5e38\u91cd\u8981\u7684\u624b\u6bb5\u3002\u5f53\u5e94\u7528\u7a0b\u5e8f\u51fa\u73b0\u5c40\u90e8\u6545\u969c\uff0c\u6bd4\u5982\u591a\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\u7684\u5176\u4e2d\u4e00\u4e2a\u5b9e\u4f8b\u6545\u969c\uff0c\u6216\u8005\u4e00\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\u7684\u591a\u4e2a\u63a5\u53e3\u4e2d\u7684\u4e00\u4e2a\u6545\u969c\uff0c\u6070\u5f53\u7684\u7194\u65ad\u673a\u5236\u80fd\u591f\u907f\u514d\u51fa\u73b0\u96ea\u5d29\u6548\u5e94\u3002\u7194\u65ad\u673a\u5236\u901a\u5e38\u6709\u5982\u4e0b\u51e0\u4e2a\u91cd\u8981\u7684\u6280\u672f\u90e8\u4ef6\u3002</p> <ul> <li>\u7194\u65ad\u7684\u76ee\u6807\u5bf9\u8c61\u3002\u76ee\u6807\u5bf9\u8c61\u53ef\u4ee5\u662f\u4e00\u4e2a\u5b9e\u4f8b\u7684\u67d0\u4e2a\u670d\u52a1\u63a5\u53e3\uff0c\u4e5f\u53ef\u4ee5\u662f\u6b63\u5728\u8bbf\u95ee\u7684\u67d0\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u4e5f\u53ef\u4ee5\u662f\u6b63\u5728\u8bbf\u95ee\u7684\u67d0\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\u7684\u67d0\u4e2a\u63a5\u53e3\u3002 \u7ad9\u5728Provider\u89c6\u89d2\u548c\u7ad9\u5728Consumer\u89c6\u89d2\uff0c\u4f1a\u6709\u4e0d\u540c\u7684\u76ee\u6807\u5bf9\u8c61\u3002\u9700\u8981\u5bf9\u76ee\u6807\u5bf9\u8c61\u8fdb\u884c\u51c6\u786e\u7684\u62bd\u8c61\uff0c\u624d\u80fd\u591f\u63d0\u4f9b\u4e00\u4e2a\u597d\u7528\u7684\u7194\u65ad\u673a\u5236\u3002 </li> <li>\u6545\u969c\u68c0\u6d4b\u65b9\u6cd5\u3002\u5bf9\u76ee\u6807\u5bf9\u8c61\u7684\u6bcf\u6b21\u8bbf\u95ee\uff0c\u9700\u8981\u5bf9\u8bbf\u95ee\u7ed3\u679c\u8fdb\u884c\u68c0\u67e5\u548c\u5206\u7c7b\uff0c\u5e76\u7edf\u8ba1\u76f8\u5173\u6307\u6807\u3002\u901a\u5e38\u68c0\u67e5\u7684\u7ed3\u679c\u5305\u62ec\u629b\u51fa\u5f02\u5e38\u3001\u8fd4\u56de\u72b6\u6001\u7801\u3001\u8bf7\u6c42\u5904\u7406\u65f6\u5ef6\u7b49\u3002 \u8fd8\u9700\u8981\u8003\u8651\u9002\u5f53\u7684\u7b97\u6cd5\u8fdb\u884c\u6307\u6807\u7edf\u8ba1\uff0c\u6bd4\u5982\u91c7\u7528\u57fa\u4e8e\u65f6\u95f4\u6216\u8005\u57fa\u4e8e\u8bf7\u6c42\u6570\u91cf\u7684\u6ed1\u52a8\u7a97\u53e3\u7b97\u6cd5\u3002</li> <li>\u7194\u65ad\u7684\u7b56\u7565\u3002\u5f53\u6545\u969c\u79ef\u7d2f\u7684\u65f6\u5019\uff0c\u5982\u4f55\u907f\u514d\u6545\u969c\u79ef\u7d2f\uff0c\u4ea7\u751f\u96ea\u5d29\u6548\u5e94\u3002\u5e38\u89c1\u7684\u7b56\u7565\u5305\u62ec\uff1a\u5feb\u901f\u5931\u8d25\uff0c\u5bf9\u76ee\u6807\u5bf9\u8c61\u7684\u8bbf\u95ee\uff0c\u7acb\u5373\u629b\u51fa\u5f02\u5e38\uff0c\u8fd4\u56de\u5931\u8d25\uff1b\u9694\u79bb\u9519\u8bef\u5bf9\u8c61\uff0c\u5f53\u76ee\u6807\u5bf9\u8c61\u5b58\u5728\u53ef\u66ff\u6362\u526f\u672c\uff0c\u6bd4\u5982\u5176\u4ed6\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u4e0d\u518d\u8bbf\u95ee\u6545\u969c\u5b9e\u4f8b\uff0c\u53ea\u8bbf\u95ee\u5176\u4ed6\u975e\u6545\u969c\u5b9e\u4f8b\u3002 </li> <li>\u7194\u65ad\u7684\u6062\u590d\u7b56\u7565\u3002\u76ee\u6807\u5bf9\u8c61\u7684\u7194\u65ad\u65f6\u957f\uff0c\u5982\u4f55\u4ece\u7194\u65ad\u72b6\u6001\u4e2d\u6062\u590d\u4e5f\u662f\u975e\u5e38\u91cd\u8981\u7684\u3002</li> </ul> <p>\u53ef\u4ee5\u770b\u51fa\uff0c\u8bbe\u8ba1\u4e00\u4e2a\u826f\u597d\u7684\u7194\u65ad\u673a\u5236\u662f\u975e\u5e38\u590d\u6742\u7684\uff0cJava Chassis 3\u7684\u7194\u65ad\u673a\u5236\u4e5f\u7ecf\u5386\u4e86\u591a\u6b21\u8c03\u6574\u548c\u4f18\u5316\u3002 </p> <ul> <li>Spring Cloud Circuit Breaker</li> </ul> <p>\u4ece <code>Spring Cloud</code> \u5b98\u7f51\u63d0\u4f9b\u7684\u4f8b\u5b50\u4ee5\u53ca\u5f00\u53d1\u6307\u5357\uff0c\u53ef\u4ee5\u7b80\u5355\u7684\u5206\u89e3\u4e0b\u4e0a\u8ff0\u6280\u672f\u90e8\u4ef6\uff1a</p> <pre><code>@Service\npublic static class DemoControllerService {\n private ReactiveCircuitBreakerFactory cbFactory;\n private WebClient webClient;\n\n\n public DemoControllerService(WebClient webClient, ReactiveCircuitBreakerFactory cbFactory) {\n this.webClient = webClient;\n this.cbFactory = cbFactory;\n }\n\n public Mono&lt;String&gt; slow() {\n return webClient.get().uri(\"/slow\").retrieve().bodyToMono(String.class).transform(\n it -&gt; cbFactory.create(\"slow\").run(it, throwable -&gt; return Mono.just(\"fallback\")));\n }\n}\n</code></pre> <p>\u76ee\u6807\u5bf9\u8c61\u662f\u7531\u5f00\u53d1\u8005\u5728\u4ee3\u7801\u4e2d\u6307\u5b9a\u7684\u3002 \u5bf9\u4e8e\u63a5\u53e3\u65b9\u6cd5\u8fd9\u7c7b\u76ee\u6807\u5bf9\u8c61\uff0c\u5f00\u53d1\u8d77\u6765\u662f\u6bd4\u8f83\u5bb9\u6613\u7684\uff0c\u4f46\u662f\u5bf9\u4e8e\u5b9e\u4f8b\uff0c\u5219\u975e\u5e38\u9ebb\u70e6\uff0c\u800c\u4e14\u65e0\u6cd5\u52a8\u6001\u7684\u8c03\u6574\u76ee\u6807\u5bf9\u8c61\uff0c\u5728\u5f00\u53d1\u7684\u65f6\u5019\u5c31\u9700\u8981\u786e\u5b9a\u597d\u3002 \u6545\u969c\u68c0\u6d4b\u65b9\u6cd5\u4e3b\u8981\u662f\u57fa\u4e8e\u5f02\u5e38\uff0c\u5373\u76ee\u6807\u5bf9\u8c61\u629b\u51fa\u5f02\u5e38\u7684\u65f6\u5019\uff0c\u4f1a\u89e6\u53d1\u7194\u65ad\u3002\u7194\u65ad\u7684\u7b56\u7565\u4e3a\u5feb\u901f\u5931\u8d25\u6a21\u5f0f\u3002 </p> <ul> <li>Java Chassis Bizkeeper</li> </ul> <p>Java Chassis \u7684\u65e9\u671f\u7248\u672c\uff0c\u57fa\u4e8e Bizkeeper \u63d0\u4f9b\u4e86\u7194\u65ad\u529f\u80fd\u3002 Bizkeeper \u96c6\u6210\u4e86 <code>Hystrix</code> \u7ec4\u4ef6\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u914d\u7f6e\u793a\u4f8b\u3002 </p> <pre><code>servicecomb:\n handler:\n chain:\n Consumer:\n default: bizkeeper-consumer\n isolation:\n Consumer:\n timeout:\n enabled: true\n timeoutInMilliseconds: 30000\n circuitBreaker:\n Consumer:\n enabled: true\n sleepWindowInMilliseconds: 15000\n requestVolumeThreshold: 20\n fallback:\n Consumer:\n enabled: true\n fallbackpolicy:\n Consumer:\n policy: throwException\n</code></pre> <p>\u76ee\u6807\u5bf9\u8c61\u662f\u5f53\u524d\u8bbf\u95ee\u7684\u65b9\u6cd5\uff0c\u53ef\u4ee5\u6307\u5b9a\u6240\u6709\u65b9\u6cd5\u3001\u67d0\u4e2aSchema\u7684\u6240\u6709\u65b9\u6cd5\u3001\u67d0\u4e2a\u5177\u4f53\u65b9\u6cd5\u3002\u6545\u969c\u68c0\u6d4b\u65b9\u6cd5\u6709\u5f02\u5e38\u3001\u8d85\u65f6\u9519\u8bef\u4e24\u79cd\u3002\u7194\u65ad\u7684\u7b56\u7565\u4e3a\u5feb\u901f\u5931\u8d25\u6a21\u5f0f\u3002 </p> <p>\u7531\u4e8e <code>Hystrix</code> \u5df2\u7ecf\u505c\u6b62\u7ef4\u62a4\uff0c\u8fd9\u4e2a\u673a\u5236\u5728 Java Chassis 3\u5df2\u7ecf\u5220\u9664\u3002 </p> <ul> <li>Java Chassis Instance Isolation</li> </ul> <p>\u8fd9\u4e2a\u673a\u5236\u662f\u57fa\u4e8e loadbalancer filter \u5f00\u53d1\u7684\u5b9e\u4f8b\u9694\u79bb\u529f\u80fd\u3002 </p> <pre><code>servicecomb:\n loadbalance:\n isolation:\n enabled: false\n errorThresholdPercentage: 0\n enableRequestThreshold: 5\n singleTestTime: 60000\n continuousFailureThreshold: 5\n maxSingleTestWindow: 60000 # \u4e3a\u4e86\u4fdd\u8bc1\u5728\u5e76\u53d1\u60c5\u51b5\u4e0b\u53ea\u6709\u4e00\u4e2a\u5b9e\u4f8b\u653e\u901a\uff0c\u4f1a\u9501\u5b9a\u653e\u901a\u5b9e\u4f8b\u3002\u8fd9\u4e2a\u65f6\u95f4\u8868\u793a\u6700\u5927\u9501\u5b9a\u65f6\u95f4\u3002\n minIsolationTime: 3000 # \u6700\u77ed\u9694\u79bb\u65f6\u95f4\u3002\u5e76\u53d1\u60c5\u51b5\u4e0b\uff0c\u5b9e\u4f8b\u9694\u79bb\u540e\u8fdb\u884c\u4e2d\u7684\u8bf7\u6c42\u53ef\u80fd\u5feb\u901f\u5237\u65b0\u9694\u79bb\u72b6\u6001\uff0c\u589e\u52a0\u6700\u77ed\u9694\u79bb\u65f6\u95f4\u3002\n recoverImmediatelyWhenSuccess: true # \u653e\u901a\u5b9e\u4f8b\uff0c\u5982\u679c\u8c03\u7528\u6210\u529f\uff0c\u7acb\u5373\u6e05\u9664\u7edf\u8ba1\u72b6\u6001\uff0c\u4fdd\u8bc1\u540e\u7eed\u8bf7\u6c42\u80fd\u591f\u4f7f\u7528\u8be5\u5b9e\u4f8b\u3002 \n</code></pre> <p>\u76ee\u6807\u5bf9\u8c61\u662f\u5b9e\u4f8b\u3002 \u6545\u969c\u68c0\u6d4b\u65b9\u6cd5\u662f\u57fa\u4e8e\u5f02\u5e38\u3002 \u7194\u65ad\u7684\u7b56\u7565\u4e3a\u4e0d\u518d\u8bbf\u95ee\u6545\u969c\u5b9e\u4f8b\uff0c\u53ea\u8bbf\u95ee\u5176\u4ed6\u975e\u6545\u969c\u5b9e\u4f8b\u3002 </p> <p>\u8be5\u529f\u80fd\u5728\u6545\u969c\u7edf\u8ba1\u65b9\u9762\u6ca1\u6709\u6ed1\u52a8\u7a97\u53e3\u7b49\u7b97\u6cd5\uff0c\u5728\u8ba1\u7b97\u9519\u8bef\u7387\u7684\u65f6\u5019\uff0c\u4f1a\u5b58\u5728\u4e0d\u7a33\u5b9a\u6ce2\u52a8\u3002 \u9519\u8bef\u7387\u8ba1\u7b97\u95ee\u9898\u4f1a\u5bfc\u81f4\u9694\u79bb\u548c\u9694\u79bb\u6062\u590d\u51fa\u73b0\u95ee\u9898\uff0c\u53ef\u4ee5\u770b\u51fa\uff0c\u4ed6\u7684\u6062\u590d\u673a\u5236\u8bbe\u8ba1\u53c2\u6570\u6bd4\u8f83\u591a\u3002 \u8fd9\u4e2a\u673a\u5236\u5728 Java Chassis 3\u5df2\u7ecf\u5220\u9664\u3002 </p> <ul> <li>Java Chassis 3 \u7684\u7194\u65ad\u673a\u5236</li> </ul> <p>Java Chassis 3 \u9488\u5bf9 <code>Provider</code> \u548c <code>Consumer</code> \u4e24\u4e2a\u89c6\u89d2\uff0c\u63d0\u4f9b\u4e86\u7194\u65ad\u673a\u5236\u3002 \u4e24\u4e2a\u673a\u5236\u7684\u6545\u969c\u68c0\u6d4b\u7684\u65b9\u6cd5\u3001\u7194\u65ad\u7b56\u7565\u548c\u7194\u65ad\u6062\u590d\u7b56\u7565\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u5728\u76ee\u6807\u5bf9\u8c61\u4e0d\u4e00\u81f4\u3002 </p> <p><code>Provider</code> \u89c6\u89d2\u7684\u7194\u65ad\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n circuitBreaker:\n allOperation: |\n minimumNumberOfCalls: 10\n slidingWindowSize: 20\n slidingWindowType: COUNT_BASED\n failureRateThreshold: 50\n recordFailureStatus: \n - 502\n - 503\n slowCallRateThreshold: 100\n slowCallDurationThreshold: 3000\n waitDurationInOpenState: 10000 \n permittedNumberOfCallsInHalfOpenState: 10\n</code></pre> <p><code>Consumer</code> \u89c6\u89d2\u7684\u7194\u65ad\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n instanceIsolation:\n allOperation: |\n minimumNumberOfCalls: 10\n slidingWindowSize: 20\n slidingWindowType: COUNT_BASED\n failureRateThreshold: 50\n slowCallRateThreshold: 100\n recordFailureStatus: \n - 502\n - 503\n slowCallDurationThreshold: 3000\n waitDurationInOpenState: 10000 \n permittedNumberOfCallsInHalfOpenState: 10\n</code></pre> <p>Java Chassis\u63d0\u4f9b\u4e86\u57fa\u4e8e\u6162\u8bf7\u6c42\u3001\u5f02\u5e38\u3001\u9519\u8bef\u7801\uff0c\u4ee5\u53ca <code>AbstractCircuitBreakerExtension</code>\u3001<code>AbstractInstanceIsolationExtension</code> \u63a5\u53e3\u8ba9\u5f00\u53d1\u8005\u81ea\u5b9a\u4e49\u7b49\u6545\u969c\u68c0\u6d4b\u65b9\u6cd5\u3002 \u5bf9\u4e8e\u6027\u80fd\u573a\u666f\uff0c\u8fd8\u53ef\u4ee5\u57fa\u4e8e\u9694\u79bb\u4ed3\u589e\u52a0\u5e76\u53d1\u6570\u9650\u5236\u6545\u969c\u68c0\u6d4b\u65b9\u6cd5\u3002 </p> <p><code>Provider</code> \u89c6\u89d2\u7684\u9694\u79bb\u4ed3\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n bulkhead:\n allOperation: |\n maxConcurrentCalls: 20\n maxWaitDuration: 1000\n</code></pre> <p><code>Consumer</code> \u89c6\u89d2\u7684\u9694\u79bb\u4ed3\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n instanceBulkhead:\n allOperation: |\n maxConcurrentCalls: 20\n maxWaitDuration: 1000\n</code></pre> <p><code>Provider</code> \u89c6\u89d2\u7684\u7194\u65ad\u5668\uff0c\u7194\u65ad\u7b56\u7565\u662f\u5feb\u901f\u5931\u8d25\uff0c\u629b\u51fa\u5f02\u5e38\uff1b<code>Consumer</code> \u89c6\u89d2\u7684\u7194\u65ad\u5668\uff0c\u7194\u65ad\u7b56\u7565\u662f\u4e3a\u4e0d\u518d\u8bbf\u95ee\u6545\u969c\u5b9e\u4f8b\uff0c\u53ea\u8bbf\u95ee\u5176\u4ed6\u975e\u6545\u969c\u5b9e\u4f8b\u3002 </p> <p>\u5728\u524d\u9762\u7684\u793a\u4f8b\u4e2d\uff0c<code>allOperation</code> \u4ee3\u8868\u4e86\u7194\u65ad\u5bf9\u8c61\u3002 Java Chassis 3\u7684\u7194\u65ad\u5bf9\u8c61\u5b9a\u4e49\u4e5f\u662f\u975e\u5e38\u7b80\u5355\u548c\u7075\u6d3b\u7684\uff1a</p> <pre><code>servicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath:\n exact: \"/\"\n method:\n - POST\n headers:\n Authentication: \n prefix: Basic\n serviceName: exampleService\n</code></pre> <p>\u7ad9\u5728<code>Provider</code> \u89c6\u89d2\uff0c \u4e0a\u8ff0\u5b9a\u4e49\u8868\u793a\u7194\u65ad\u5bf9\u8c61\u662f\u6765\u81ea <code>exampleService</code> \u7684\u8bbe\u7f6e\u4e86\u8ba4\u8bc1\u5934\u7684\u6240\u6709 POST \u65b9\u6cd5\uff1b \u7ad9\u5728<code>Consumer</code> \u89c6\u89d2\uff0c \u4e0a\u8ff0\u5b9a\u4e49\u8868\u793a\u7194\u65ad\u5bf9\u8c61\u662f\u53d1\u5f80 <code>exampleService</code> \u7684\u67d0\u4e2a\u5177\u4f53\u7684\u5b9e\u4f8b\uff0c\u5e76\u4e14\u8bbe\u7f6e\u4e86\u8ba4\u8bc1\u5934\u7684\u6240\u6709 POST \u65b9\u6cd5\u3002 </p> <p>Java Chassis 3\u7194\u65ad\u673a\u5236\u9010\u6b65\u6210\u4e3a\u662f\u4e00\u4e2a\u7b80\u5355\u6613\u7528\uff0c \u6ee1\u8db3\u7edd\u5927\u90e8\u5206\u4e1a\u52a1\u573a\u666f\u9700\u8981\u7684\u901a\u7528\u8bbe\u8ba1\u89c4\u8303\u3002 </p> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u5ba2\u6237\u671f\u671b\u5efa\u7acb\u4e00\u79cd\u6301\u7eed\u6f14\u8fdb\u7684\u6545\u969c\u5904\u7406\u673a\u5236\uff0c\u4ee5\u964d\u4f4e\u968f\u7740\u7cfb\u7edf\u957f\u671f\u8fd0\u884c\uff0c\u968f\u673a\u6545\u969c\u3001\u7cfb\u7edf\u53d8\u6162\u7b49\u573a\u666f\u5bf9\u6574\u4f53\u6545\u969c\u7684\u5f71\u54cd\uff0c\u52a8\u6001\u9002\u5e94\u6301\u7eed\u53d8\u5316\u7684\u73af\u5883\u5bf9\u53ef\u9760\u6027\u5e26\u6765\u7684\u6311\u6218\u3002Java Chassis 3\u7684\u670d\u52a1\u6cbb\u7406\u914d\u7f6e\u673a\u5236\uff0c\u53ef\u4ee5\u4f7f\u5f97\u5ba2\u6237\u4e0d\u9700\u8981\u4fee\u6539\u4ee3\u7801\u548c\u91cd\u542f\u5e94\u7528\uff0c\u5c31\u80fd\u591f\u52a8\u6001\u8c03\u6574\u8017\u65f6\u63a5\u53e3\u548c\u6545\u969c\u63a5\u53e3\u7684\u7194\u65ad\u7b56\u7565\u3002\u901a\u8fc7\u89c4\u8303\u8d4b\u80fd\uff0c\u8fd0\u7ef4\u4eba\u5458\u5c31\u80fd\u591f\u89e3\u51b3\u4e00\u4e9b\u5e38\u89c1\u7684\u8fc7\u8f7d\u9632\u62a4\u95ee\u9898\u3002 </p>"},{"location":"featured-topics/secrets/fail-fast.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u8fc7\u8f7d\u72b6\u6001\u4e0b\u7684\u5feb\u901f\u5931\u8d25","text":"<p>\u5728 <code>\u7194\u65ad\u673a\u5236\u7684\u6539\u8fdb\u8def\u7a0b</code> \u6280\u672f\u89e3\u5bc6\u4e2d\uff0c\u603b\u7ed3\u4e86\u5982\u4f55\u8bbe\u8ba1\u4e00\u4e2a\u4f18\u96c5\u7684\u7194\u65ad\u673a\u5236\u3002 \u4f5c\u4e3a\u5fae\u670d\u52a1\u6700\u91cd\u8981\u7684\u6cbb\u7406\u7b56\u7565\u4e4b\u4e00\uff0c\u7194\u65ad\u673a\u5236\u80fd\u591f\u5728\u6545\u969c\u573a\u666f\u8d77\u5230\u9632\u6b62\u96ea\u5d29\u6548\u5e94\u7684\u4f5c\u7528\u3002\u8fc7\u8f7d\u72b6\u6001\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u6545\u969c\u573a\u666f\uff0c\u4e3b\u8981\u6307\u8d85\u51fa\u4e86\u7cfb\u7edf\u5904\u7406\u80fd\u529b\u7684\u8bf7\u6c42\u91cf\u3002 \u5728\u8fc7\u8f7d\u72b6\u6001\uff0c\u7194\u65ad\u673a\u5236\u53ef\u80fd\u65e0\u6cd5\u8d77\u5230\u9884\u671f\u7684\u6548\u679c\u3002 \u4e3a\u4e86\u5bf9\u8fc7\u8f7d\u72b6\u6001\u4e0b\u7684\u9632\u62a4\u6709\u4e2a\u6bd4\u8f83\u76f4\u89c2\u7684\u8ba4\u8bc6\uff0c \u6211\u4eec\u5148\u8ba8\u8bba\u51e0\u4e2a\u5178\u578b\u573a\u666f\uff1a</p> <ul> <li>\u5047\u8bbe\u7cfb\u7edf\u542f\u7528\u4e86\u7194\u65ad\u673a\u5236\uff0c\u5e76\u4e14\u8bbe\u7f6e\u4e86\u9694\u79bb\u4ed3\u6765\u68c0\u6d4b\u8fc7\u8f7d\u60c5\u51b5\u3002 \u5f53\u7cfb\u7edf\u6d41\u91cf\u8fc7\u8f7d\u7684\u65f6\u5019\uff0c\u9694\u79bb\u4ed3\u89e6\u53d1\u8fc7\u8f7d\u4fdd\u62a4\uff0c\u7194\u65ad\u673a\u5236\u4f1a\u77ed\u6682\u9694\u79bb\u5bf9\u4e8e\u5b9e\u4f8b\u7684\u8bbf\u95ee\uff0c\u5e76\u5c06\u6d41\u91cf\u8f6c\u79fb\u5230\u5176\u4ed6\u5b9e\u4f8b\u3002 \u7531\u4e8e\u603b\u7684\u5904\u7406\u5b9e\u4f8b\u6570\u51cf\u5c11\uff0c\u7cfb\u7edf\u5b9e\u9645\u80fd\u591f\u5904\u7406\u7684\u8d1f\u8377\u5728\u7194\u65ad\u673a\u5236\u751f\u6548\u7684\u573a\u666f\u4e0b\uff0c\u4f1a\u8fdb\u4e00\u6b65\u964d\u4f4e\u3002 \u8fd9\u610f\u5473\u7740\uff0c\u76f8\u8f83\u4e8e\u6ca1\u6709\u7194\u65ad\u673a\u5236\uff0c\u8fc7\u8f7d\u573a\u666f\u7194\u65ad\u673a\u5236\u53cd\u800c\u66f4\u5bb9\u6613\u89e6\u53d1\u96ea\u5d29\u6548\u5e94\u3002</li> <li>\u5b9e\u9645\u4e1a\u52a1\u573a\u666f\u4e2d\uff0c\u4e00\u4e9b\u63a5\u53e3\u6bd4\u8f83\u8017\u65f6\uff0c\u5176\u4ed6\u63a5\u53e3\u90fd\u5f88\u5feb\u7684\u60c5\u51b5\u975e\u5e38\u5e38\u89c1\u3002 \u5982\u679c\u5bf9\u8017\u65f6\u63a5\u53e3\u5f00\u542f\u9694\u79bb\u4ed3\u8fdb\u884c\u8fc7\u8f7d\u9632\u62a4\uff0c\u4f1a\u589e\u52a0\u8017\u65f6\u63a5\u53e3\u7684\u5931\u8d25\u7387\uff1b\u5982\u679c\u4e0d\u5f00\u542f\u8fc7\u8f7d\u9632\u62a4\uff0c\u8017\u65f6\u63a5\u53e3\u7684\u5e76\u53d1\u589e\u52a0\uff0c\u76f4\u89c2\u7684\u8868\u73b0\u662f\u7528\u6237\u54cd\u5e94\u65f6\u95f4\u7684\u589e\u52a0\u3002\u5728\u4e00\u4e9b\u4e1a\u52a1\u7cfb\u7edf\u770b\u6765\uff0c\u7528\u6237\u4f53\u9a8c\u7684\u4e0b\u964d\u7684\u5f71\u54cd\u8fdc\u5c0f\u4e8e\u6545\u969c\u7387\u589e\u52a0\u7684\u5f71\u54cd\u3002 \u5fae\u670d\u52a1\u6cbb\u7406\u7b56\u7565\u5bf9\u4e8e\u8fd9\u7c7b\u7cfb\u7edf\uff0c\u4e5f\u53ef\u80fd\u5e26\u6765\u9002\u5f97\u5176\u53cd\u7684\u6548\u679c\u3002 </li> </ul> <p>\u5728\u8fc7\u8f7d\u573a\u666f\uff0c\u4e0d\u80fd\u8fdb\u5165\u7194\u65ad\u72b6\u6001\uff0c\u8fd9\u9700\u8981\u989d\u5916\u7684\u4fdd\u62a4\u673a\u5236\u6765\u9632\u6b62\u8fc7\u8f7d\u3002 \u5feb\u901f\u5931\u8d25\u673a\u5236\u662f\u9632\u6b62\u8fc7\u8f7d\u7684\u6700\u5e38\u7528\u624b\u6bb5\uff0c\u867d\u7136\u5b58\u5728\u6027\u80fd\u8981\u6c42\u4e0d\u9ad8\u7684\u4e1a\u52a1\u573a\u666f\uff0c\u5feb\u901f\u5931\u8d25\u4f1a\u5bfc\u81f4\u9519\u8bef\u7387\u63d0\u5347\u8fd9\u79cd\u770b\u4f3c\u77db\u76fe\u7684\u60c5\u51b5\uff0c\u4f46\u662f\u6ca1\u6709\u8ba9\u5feb\u901f\u5931\u8d25\u673a\u5236\u5173\u4e0a\u5927\u95e8\uff0c\u6070\u5f53\u7684\u5feb\u901f\u5931\u8d25\u5e76\u642d\u914d\u4e1a\u52a1\u4e0a\u7684\u91cd\u8bd5\u7684\u5904\u7406\u8fd8\u53ef\u4ee5\u660e\u663e\u6539\u5584\u7528\u6237\u4f53\u9a8c\u3002 \u5feb\u901f\u5931\u8d25\u673a\u5236\u7684\u8981\u6c42\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u5c3d\u65e9\u7684\u62d2\u7edd\u8fc7\u8f7d\u6d41\u91cf\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11\u8fc7\u8f7d\u6d41\u91cf\u5360\u7528\u7684CPU\u548c\u5176\u4ed6\u8d44\u6e90\u65f6\u95f4\u3002</p>"},{"location":"featured-topics/secrets/fail-fast.html#_1","title":"\u9650\u6d41","text":"<p>\u9650\u6d41\u662f\u6700\u5e38\u7528\u7684\u5feb\u901f\u5931\u8d25\u63aa\u65bd\u3002 \u4f46\u6709\u4e2a\u7ec6\u8282\u7ecf\u5e38\u4f1a\u88ab\u5ffd\u7565\uff1a\u6d41\u91cf\u7ecf\u5e38\u662f\u4e0d\u5747\u8861\u7684\uff0c\u77ac\u65f6\u6d41\u91cf\u8d85\u8fc7\u9608\u503c\uff0c\u4e0d\u4ee3\u8868\u8fd9\u4e9b\u6d41\u91cf\u5c31\u5e94\u8be5\u88ab\u62d2\u7edd\u6389\u3002 \u4e00\u4e2a\u826f\u597d\u7684\u9650\u6d41\u63aa\u65bd\uff0c\u9700\u8981\u5bf9\u6d41\u91cf\u8fdb\u884c\u9002\u5f53\u7684\u68b3\u7406\uff0c\u4ee5\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684\u9650\u6d41\u3002 \u6bd4\u5982\u4e0b\u56fe\uff0c\u9650\u6d41\u7684\u6838\u5fc3\u4f5c\u7528\u662f\u5c06\u6bcf\u4e2a\u65f6\u95f4\u7247\u5185\uff0c\u4e0d\u5747\u5300\u7684\u6d41\u91cf\uff0c\u53d8\u6210\u5747\u5300\u7684\u6d41\u91cf\u3002 </p> <p></p> <p>\u9650\u6d41\u53d1\u751f\u7684\u65f6\u673a\u8d8a\u65e9\u8d8a\u597d\u3002\u901a\u5e38\u4f1a\u5728 edge service \u5e94\u7528\u9650\u6d41\u7b56\u7565\u3002 </p> <pre><code>## \u670d\u52a1\u6cbb\u7406\u914d\u7f6e\nservicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath: \n prefix: \"/\"\n rateLimiting:\n ## \u9650\u6d41\u5668\u6bcf1\u6beb\u79d2\u5141\u8bb8\u901a\u8fc710\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\n allOperation: |\n rate: 10\n limitRefreshPeriod: 1\n timeoutDuration: 1000\n</code></pre> <p>\u4e0a\u8ff0\u9650\u6d41\u7b56\u7565\u9650\u5236\u4e86\u5355\u4f4d\u65f6\u95f4\u5185\u8fdb\u5165 edge service \u7684\u8bf7\u6c42\u6570\u91cf\uff0c\u5e76\u80fd\u5bf9\u8bf7\u6c42\u8fdb\u884c\u68b3\u7406\u3002\u9650\u5236\u6570\u91cf\u53ef\u80fd\u5728\u5e94\u7528\u7a0b\u5e8f\u751f\u547d\u5468\u671f\u8fc7\u7a0b\u4e2d\u96be\u4e8e\u89c4\u5212\uff0c\u9700\u8981\u901a\u8fc7\u7cfb\u7edf\u6027\u7684\u6027\u80fd\u6d4b\u8bd5\u6765\u8bc4\u4f30\u9650\u5236\u5927\u5c0f\u3002 \u4e00\u4e2a\u6bd4\u8f83\u597d\u7684\u7b56\u7565\u662f\u901a\u8fc7\u5e76\u53d1\u6570\u6765\u9650\u5236\u6d41\u91cf\u3002\u5728 edge service\uff0c \u53ef\u4ee5\u9650\u5236\u53d1\u5f80\u67d0\u4e2a\u4e0b\u6e38\u7684\u5b9e\u4f8b\u5f53\u524d\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u3002 </p> <pre><code>## \u670d\u52a1\u6cbb\u7406\u914d\u7f6e\nservicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath: \n prefix: \"/\"\n instanceBulkhead:\n ## \u9694\u79bb\u4ed3\u9650\u5236\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u4e3a20\u4e2a\uff0c\u65b0\u6765\u7684\u8bf7\u6c42\u7b49\u5f851000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\u3002\n allOperation: |\n maxConcurrentCalls: 100\n maxWaitDuration: 1000\n</code></pre> <p>\u76f8\u6bd4\u8f83\u4e8e\u5355\u4f4d\u65f6\u95f4\u5185\u8bf7\u6c42\u6570\uff0c \u5f53\u524d\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u80fd\u591f\u5f88\u597d\u7684\u53cd\u9988\u5f53\u524d\u7684\u7cfb\u7edf\u7e41\u5fd9\u7a0b\u5ea6\uff0c\u56e0\u4e3a\u4e00\u4e2a\u8bf7\u6c42\u7684\u65f6\u5ef6\u589e\u52a0\uff0c\u4f1a\u5bfc\u81f4\u5f53\u524d\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u589e\u52a0\u3002\u5bf9\u4e8eCPU\u5bc6\u96c6\u578b\u4efb\u52a1\uff0c \u53ef\u4ee5\u8bbe\u7f6e\u7a0d\u5fae\u5c0f\u4e00\u70b9\u7684\u503c\uff1b\u5bf9\u4e8eIO\u5bc6\u96c6\u578b\u4efb\u52a1\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u7a0d\u5fae\u5927\u4e00\u70b9\u7684\u503c\u3002 </p>"},{"location":"featured-topics/secrets/fail-fast.html#_2","title":"\u7ebf\u7a0b\u6c60\u961f\u5217\u548c\u8fde\u63a5\u6c60\u961f\u5217","text":"<p>\u5728\u7ebf\u7a0b\u6c60\u5165\u961f\u548c\u51fa\u961f\u7684\u65f6\u5019\uff0c\u8fdb\u884c\u5feb\u901f\u5931\u8d25\uff0c\u4e5f\u662f\u975e\u5e38\u5e38\u7528\u800c\u4e14\u6bd4\u8f83\u6709\u6548\u7684\u624b\u6bb5\u3002 </p> <pre><code>servicecomb:\n executor:\n default:\n maxQueueSize-per-group: 1000\n</code></pre> <p>\u4e0a\u8ff0\u914d\u7f6e\u9650\u5236\u4e86\u7ebf\u7a0b\u6c60\u7684\u961f\u5217\u5927\u5c0f\uff0c \u5c11\u91cf\u7684\u8fc7\u8f7d\u8bf7\u6c42\u4f1a\u88ab\u6392\u961f\uff0c\u961f\u5217\u8d85\u9650\u540e\u5c31\u4f1a\u5feb\u901f\u62d2\u7edd\u5e76\u5931\u8d25\u3002 </p> <pre><code>servicecomb:\n rest:\n server:\n requestWaitInPoolTimeout: 1000\n</code></pre> <p>Java Chassis\u5728\u51fa\u961f\u7684\u65f6\u5019\uff0c\u4e5f\u4f1a\u68c0\u6d4b\u4efb\u52a1\u7b49\u5f85\u7684\u65f6\u95f4\u3002 \u5982\u679c\u7b49\u5f85\u65f6\u95f4\u8fc7\u957f\uff0c \u4e5f\u4f1a\u7acb\u5373\u62d2\u7edd\u8be5\u4efb\u52a1\uff0c\u907f\u514d\u989d\u5916\u7684\u5904\u7406\u8d44\u6e90\u6d6a\u8d39\u3002 </p> <p>\u7ebf\u7a0b\u6c60\u961f\u5217\u4e0d\u9002\u7528\u4e8eedge service\u6216\u8005\u91c7\u7528reactive\u5b9a\u4e49\u63a5\u53e3\u7684\u573a\u666f\uff0c \u5728reactive\u6a21\u5f0f\uff0c\u901a\u5e38\u7684\u7ade\u4e89\u8d44\u6e90\u662f\u8fde\u63a5\u6c60\uff0c\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u914d\u7f6e\u9879\u63a7\u5236\u8fde\u63a5\u6c60\u7b49\u5f85\u961f\u5217\uff1a</p> <pre><code>servicecomb:\n rest:\n client:\n maxWaitQueueSize: 100\n</code></pre>"},{"location":"featured-topics/secrets/fail-fast.html#_3","title":"\u5168\u5c40\u7684\u8d85\u65f6\u68c0\u6d4b","text":"<p>\u4e00\u822c\u7684RPC\u7cfb\u7edf\u4f1a\u9488\u5bf9\u8bf7\u6c42\u53d1\u9001\u5230\u54cd\u5e94\u63a5\u6536\u8bbe\u7f6e\u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\u3002 \u5fae\u670d\u52a1\u7cfb\u7edf\u7ed3\u6784\u901a\u5e38\u7684\u8c03\u7528\u5173\u7cfb\u6bd4\u8f83\u590d\u6742\u3002 \u6bd4\u5982\u4e00\u4e2a\u8bf7\u6c42\u94fe\u8def\u53ef\u80fd\u6d89\u53ca a -&gt; b -&gt; c -&gt; d\u3002 \u5982\u679c\u6211\u4eec\u7684\u8bbe\u8ba1\u76ee\u6807\u662f\u8bf7\u6c42\u5904\u7406\u65f6\u95f4\u5c0f\u4e8e30s\uff0c \u5982\u679c\u5728 b \u63a5\u6536\u5230 a \u7684\u8bf7\u6c42\u7684\u65f6\u5019\uff0c \u53d1\u73b0\u5df2\u7ecf\u5904\u7406\u4e86 30s\uff0c b\u5b8c\u5168\u53ef\u4ee5\u4e0d\u9700\u8981\u8bf7\u6c42c\u6765\u5904\u7406\u8fd9\u4e2a\u8bf7\u6c42\uff0c \u5feb\u901f\u5931\u8d25\u3002 Java Chassis \u80fd\u591f\u5728\u4efb\u52a1\u5904\u7406\u7684\u5173\u952e\u9636\u6bb5\uff0c\u8fdb\u884c\u5168\u5c40\u7684\u5df2\u7ecf\u5904\u7406\u7684\u65f6\u95f4\u68c0\u67e5\u3002 </p> <p>\u5168\u5c40\u7684\u8d85\u65f6\u68c0\u6d4b\u53ef\u4ee5\u5904\u7406\u5bf9\u5feb\u901f\u5931\u8d25\u6709\u975e\u5e38\u7279\u6b8a\u8981\u6c42\u7684\u4e1a\u52a1\u573a\u666f\uff0c\u8003\u8651\u5230\u591a\u6570\u60c5\u51b5\u4e0b\u90fd\u4f1a\u5f88\u5c11\u4f7f\u7528\uff0c\u8fd9\u91cc\u4e0d\u5728\u8be6\u7ec6\u63cf\u8ff0\u5176\u6280\u672f\u7ec6\u8282\uff0c \u611f\u5174\u8da3\u7684\u5f00\u53d1\u8005\u53ef\u4ee5\u53c2\u8003Java Chassis\u7684\u5f00\u53d1\u6307\u5bfc\u3002 </p> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u7cfb\u7edf\u6bdb\u523a\uff08\u6307\u7cfb\u7edf\u4e2d\u6781\u4f4e\u6982\u7387\u7684\u8bf7\u6c42\u7f13\u6162\u6216\u8005\u5904\u7406\u8d85\u65f6\uff09\u662f\u56f0\u6270\u89c9\u5927\u591a\u6570\u5e94\u7528\u7684\u8001\u5927\u96be\u95ee\u9898\u3002 \u56e0\u4e3a\u5bfc\u81f4\u7cfb\u7edf\u6bdb\u523a\u7684\u56e0\u7d20\u975e\u5e38\u591a\uff0c\u5305\u62ec\u8bf7\u6c42\u7684\u5206\u5e03\u4e0d\u5747\u8861\u3001CPU\u8c03\u5ea6\u7684\u4e0d\u53ef\u9884\u671f\u3001\u5783\u573e\u56de\u6536\u7b49\u7b49\u3002 \u7cfb\u7edf\u6bdb\u523a\u7ed9\u5ba2\u6237\u7684\u7528\u6237\u4f53\u9a8c\u8bc4\u4ef7\u5e26\u6765\u5f88\u591a\u8d1f\u9762\u7684\u5f71\u54cd\uff0c\u6574\u4f53\u8bf7\u6c42\u6210\u529f\u7387\u504f\u4f4e\uff0c\u5e73\u5747\u54cd\u5e94\u65f6\u5ef6\u504f\u9ad8\u3002 \u4e3a\u4e86\u6539\u5584\u6bdb\u523a\uff0c\u65e9\u671f\u7684\u4e3b\u8981\u673a\u5236\u662f\u8bbe\u7f6e\u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\uff0c\u5305\u62ec\u8bbe\u7f6e\u67d0\u4e2a\u5177\u4f53\u5fae\u670d\u52a1\u7684\u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\uff0c\u6216\u8005\u6839\u636e\u8c03\u7528\u7684\u987a\u5e8f\uff0c\u914d\u7f6e\u9010\u7ea7\u9012\u51cf\u7684\u8d85\u65f6\u65f6\u95f4\u3002 \u8d85\u65f6\u65f6\u95f4\u7684\u914d\u7f6e\u786e\u5b9e\u8d77\u5230\u4e86\u5feb\u901f\u5931\u8d25\u7684\u76ee\u7684\uff0c\u7136\u800c\u5728HTTP\u573a\u666f\u4e0b\uff0c\u8d85\u65f6\u4f1a\u5bfc\u81f4\u5173\u95ed\u8fde\u63a5\u5e76\u91cd\u65b0\u5efa\u8fde\uff0c\u5728\u5927\u5e76\u53d1\u573a\u666f\uff0c\u4f1a\u5f15\u5165\u66f4\u957f\u65f6\u95f4\u7684\u6bdb\u523a\u548c\u8bf7\u6c42\u8d85\u65f6\u3002 \u5f15\u5165\u6d41\u91cf\u68b3\u7406\u548c\u9694\u79bb\u4ed3\u673a\u5236\u540e\uff0c\u7cfb\u7edf\u6bdb\u523a\u95ee\u9898\u548c\u8d85\u65f6\u5bfc\u81f4\u7684\u8fde\u63a5\u91cd\u8fde\u95ee\u9898\u5f97\u5230\u4e86\u6781\u5927\u7684\u6539\u5584\u3002 </p>"},{"location":"featured-topics/secrets/interoperability.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u4e0eSpring Cloud\u7684\u4e92\u64cd\u4f5c","text":"<p>Java Chassis 3\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u8bbe\u8ba1\u539f\u5219\uff1a\u5229\u7528\u67b6\u6784\u7684\u97e7\u6027\u8bbe\u8ba1\u6765\u89e3\u51b3\u517c\u5bb9\u6027\u95ee\u9898\u3002 </p> <p></p> <p>\u6bd4\u5982\u901a\u8fc7\u5f15\u5165\u5fae\u670d\u52a1\u7f51\u5173\uff0c\u6765\u89e3\u51b3\u4e0d\u540c\u8bed\u8a00\u3001\u4e0d\u540c\u6846\u67b6\u3001\u9057\u7559\u7cfb\u7edf\u4e4b\u95f4\u7684\u4e92\u64cd\u4f5c\u95ee\u9898\u3002 \u672c\u6587\u5728\u8fd9\u4e2a\u67b6\u6784\u539f\u5219\u57fa\u7840\u4e0a\uff0c\u8ba8\u8bba\u4e00\u4e2a\u66f4\u52a0\u7ec6\u7c92\u5ea6\u7684\u4e92\u64cd\u4f5c\u95ee\u9898\uff0c\u5e76\u501f\u6b64\u89e3\u5bc6Java Chassis3\u5728\u8fd0\u884c\u65f6\u8bbe\u8ba1\u4f9d\u8d56\u4e0a\u7684\u6280\u672f\u7ec6\u8282\u3002</p> <p>\u9996\u5148\uff0c\u6211\u4eec\u63cf\u8ff0\u4e00\u4e2a\u4e92\u64cd\u4f5c\u7684\u573a\u666f\u548c\u5047\u8bbe\u3002 </p> <p></p> <ul> <li>Spring Cloud\u548cJava Chassis\u5e94\u7528\u540c\u65f6\u6ce8\u518c\u5230\u6ce8\u518c\u4e2d\u5fc3\u3002\u5f15\u5165\u4e86Spring Cloud Gateway\u4f5c\u4e3a\u7f51\u5173\uff0c\u7f51\u5173\u4e5f\u6ce8\u518c\u5230\u6ce8\u518c\u4e2d\u5fc3\u3002 </li> <li>Spring Cloud\u5fae\u670d\u52a1\u548cJava Chassis\u5fae\u670d\u52a1\u76f8\u4e92\u8c03\u7528\u3002\u5b83\u4eec\u5f7c\u6b64\u4f5c\u4e3a\u6d88\u8d39\u8005\u7684\u65f6\u5019\uff0c\u4e0d\u9700\u8981\u611f\u77e5\u5bf9\u65b9\u662f\u4e0d\u540c\u7684\u6846\u67b6\uff0c\u505a\u5230\u900f\u660e\u8c03\u7528\u3002 </li> </ul> <p>\u4ece\u6280\u672f\u539f\u7406\u4e0a\u68b3\u7406\u4e0b\u4e0a\u8ff0\u4e92\u64cd\u4f5c\u9700\u8981\u6ee1\u8db3\u7684\u6761\u4ef6\uff1a</p> <ul> <li>Spring Cloud\u548cJava Chassis\u9700\u8981\u6709\u76f8\u4e92\u8ba4\u8bc6\u7684\u6ce8\u518c\u4fe1\u606f\u3002\u6838\u5fc3\u5305\u62ec\uff1a\u5e94\u7528\u540d\u79f0\u3001\u670d\u52a1\u540d\u79f0\u3001\u5730\u5740\u4fe1\u606f\u548c\u683c\u5f0f\u7b49\u3002 \u9700\u8981\u7684\u5171\u540c\u6ce8\u518c\u4e2d\u5fc3\u8d8a\u5c11\uff0c\u8d8a\u5bb9\u6613\u5bf9\u6ce8\u518c\u4e2d\u5fc3\u548c\u5ba2\u6237\u7aef\u8fdb\u884c\u9009\u578b\u3002 \u5728\u672c\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u9009\u62e9 <code>Service Center</code> \u6216\u8005 <code>Nacos</code> \u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\uff0c\u5e76\u9009\u62e9Spring Cloud Huawei\u5b9e\u73b0Spring Cloud\u6ce8\u518c\u3002 </li> <li>Spring Cloud\u8bbf\u95eeJava Chassis\uff0c\u53ea\u9700\u8981\u4e00\u4e2a\u5730\u5740\u4fe1\u606f\uff0c\u4f9d\u8d56\u8f83\u5c11\u3002 Java Chassis\u8bbf\u95eeSpring Cloud\uff0c\u9700\u8981\u77e5\u9053Spring Cloud\u5e94\u7528\u63d0\u4f9b\u7684\u5951\u7ea6\u4fe1\u606f\u3002 </li> </ul> <p>Java Chassis\u533a\u522b\u4e8eSpring Cloud\u7684REST\u8c03\u7528\u7684\u90e8\u5206\uff0c\u5c31\u662f\u5951\u7ea6\u4f9d\u8d56\u3002 Spring Cloud\u901a\u8fc7FeignClient\u6765\u58f0\u660e\u5ba2\u6237\u7aef\u5951\u7ea6\uff0c\u5ba2\u6237\u7aef\u90fd\u9700\u8981\u5728FeignClient\u4e2d\u91cd\u590d\u4e66\u5199REST\u6807\u7b7e\uff1bJava Chassis\u6709\u4e24\u79cd\u6a21\u5f0f\u53d1\u73b0\u5951\u7ea6\uff1a\u4ece\u6ce8\u518c\u4e2d\u5fc3\u53d1\u73b0\u548c\u4eceProvider\u5b9e\u4f8b\u53d1\u73b0\u3002 Java Chassis3\u9ed8\u8ba4\u91c7\u7528\u4eceProvider\u5b9e\u4f8b\u53d1\u73b0\uff0c Java Chassis2\u91c7\u7528\u4ece\u6ce8\u518c\u4e2d\u5fc3\u53d1\u73b0\u3002 \u4eceProvider\u53d1\u73b0\u7684\u597d\u5904\u662f\u53ef\u4ee5\u964d\u4f4e\u5bf9\u4e8e\u6ce8\u518c\u4e2d\u5fc3\u5143\u6570\u636e\u7ba1\u7406\u80fd\u529b\u7684\u8981\u6c42\uff0c\u672c\u4f8b\u65e2\u53ef\u4ee5\u91c7\u7528 <code>Service Center</code> \u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\uff0c\u4e5f\u53ef\u4ee5\u9009\u62e9 <code>Nacos</code> \u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u3002 </p> <p>\u4eceProvider\u53d1\u73b0\uff0c\u8981\u6c42Provider\u5b9e\u73b0\u5982\u4e0b\u63a5\u53e3\uff1a</p> <pre><code>/**\n * Java Chassis internal management apis.\n */\n@Path(\"/scb/management\")\npublic interface ManagementEndpoint {\n String NAME = \"scb-management\";\n\n /**\n * Health of this instance. If the instanceId match this instance, and this service is ready\n * to service return true. Otherwise, return false.\n *\n * This api is for internal instance status usage. Load balancer will call this api to check if\n * the target instance is alive.\n */\n @GET\n @Path(\"/health\")\n boolean health(@QueryParam(\"instanceId\") String instanceId, @QueryParam(\"registryName\") String registryName);\n\n /**\n * Schemas of this instance.\n *\n * This api is for internal schema loading usage.\n */\n @POST\n @Path(\"/schema/contents\")\n Map&lt;String, String&gt; schemaContents();\n}\n</code></pre> <p>\u5b83\u5305\u542b\u4e00\u4e2a\u5065\u5eb7\u68c0\u67e5\u63a5\u53e3\u548c\u4e00\u4e2a\u67e5\u8be2\u5951\u7ea6\u7684\u63a5\u53e3\u3002 \u5f53Spring Cloud\u5e94\u7528\u5b9e\u73b0\u4e0a\u8ff0\u63a5\u53e3\u4ee5\u540e\uff0c\u5b83\u5c31\u5177\u5907\u4e86Java Chassis\u5fae\u670d\u52a1\u9700\u8981\u7684\u57fa\u7840\u7279\u5f81\uff0c\u8fd9\u6837Java Chassis\u5c31\u53ef\u4ee5\u50cf\u8bbf\u95ee\u672c\u6846\u67b6\u7684\u5fae\u670d\u52a1\u4e00\u6837\u8bbf\u95eeSpring Cloud\u6846\u67b6\u5f00\u53d1\u7684\u5fae\u670d\u52a1\u5e94\u7528\u3002 \u4e3a\u4e86\u7b80\u5316\uff0c\u5728Spring Cloud\u7b80\u5355\u5b9e\u73b0\u4e86\u8be5\u63a5\u53e3\uff0c\u8be5\u5b9e\u73b0\u63a5\u53e3\u4ece <code>export</code> \u76ee\u5f55\u52a0\u8f7d\u5951\u7ea6\u4fe1\u606f\uff0c\u53ea\u9700\u8981\u5c06Spring Cloud\u9700\u8981\u5bf9\u5916\u66b4\u9732\u7684 REST \u63a5\u53e3\u7684\u7b26\u5408 Open API 3.0\u89c4\u8303\u7684\u5951\u7ea6\u6587\u4ef6\u653e\u5230\u8fd9\u4e2a\u76ee\u5f55\u4e0b\u9762 \u3002</p> <pre><code>@RestController\n@RequestMapping((\"/scb/management\"))\npublic class JavaChassisManagementEndpoint {\n private static final Logger LOGGER = LoggerFactory.getLogger(JavaChassisManagementEndpoint.class);\n\n @Autowired\n private Registration registration;\n\n @GetMapping(path = \"/health\")\n public boolean health(@RequestParam(\"instanceId\") String instanceId,\n @RequestParam(\"registryName\") String registryName) {\n return \"sc-registry\".equals(registryName) &amp;&amp; registration.getInstanceId().equals(instanceId);\n }\n\n @PostMapping(path = \"/schema/contents\")\n public Map&lt;String, String&gt; schemaContents() {\n try {\n List&lt;URI&gt; resourceUris = ResourceUtil.findResourcesBySuffix(\"export\", \".yaml\");\n Map&lt;String, String&gt; result = new HashMap&lt;&gt;(resourceUris.size());\n for (URI uri : resourceUris) {\n String path = uri.toURL().getPath();\n String[] segments = path.split(\"/\");\n if (segments.length &lt; 2 || !\"export\".equals(segments[segments.length - 2])) {\n continue;\n }\n result.put(segments[segments.length - 1].substring(0, segments[segments.length - 1].indexOf(\".yaml\")),\n IOUtils.toString(uri, StandardCharsets.UTF_8));\n }\n return result;\n } catch (IOException | URISyntaxException e) {\n LOGGER.error(\"Load schema ids failed from microservices. {}.\", e.getMessage());\n return Collections.emptyMap();\n }\n }\n}\n</code></pre> <p>Java Chassis\u4e0eSpring Cloud\u4e92\u64cd\u4f5c\u7684\u4f8b\u5b50\u653e\u5230\u4e86ServiceComb Samples \uff0c \u8fd9\u4e2a\u4f8b\u5b50\u4e5f\u63d0\u4f9b\u4e86\u4f7f\u7528 Nacos \u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\u7684\u5b9e\u73b0\uff0c \u53ea\u9700\u8981\u5c06 Profile \u8bbe\u7f6e\u4e3a Nacos \u5373\u53ef\u3002 </p> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u5728\u67b6\u6784\u9009\u578b\u53d8\u5316\u7684\u65f6\u5019\uff0c\u89e3\u51b3\u529f\u80fd\u8fc1\u79fb\u548c\u517c\u5bb9\u6027\u95ee\u9898\u662f\u6700\u5927\u7684\u6311\u6218\u3002\u4e00\u4e9b\u5ba2\u6237\u5c06Spring Cloud\u5e94\u7528\u6539\u9020\u4e3aJava Chassis\u7684\u8fc7\u7a0b\u4e2d\uff0c\u53d1\u73b0\u4e00\u4e9b\u529f\u80fd\u4e0d\u652f\u6301\uff0c\u6bd4\u5982SseEmitter\u3001WebSocket\u7b49\u3002 \u5982\u679c\u9009\u62e9\u652f\u6301\u8fd9\u4e9b\u80fd\u529b\uff0cJava Chassis\u9700\u8981\u5b9e\u73b0\u5f88\u591aServlet\u80fd\u529b\uff0c\u8fd9\u4e9b\u80fd\u529b\u89c4\u5212\u4f1a\u548c\u5fae\u670d\u52a1\u6280\u672f\u67b6\u6784\u5b58\u5728\u51b2\u7a81\u3002 \u5bf9\u4e8e\u8fd9\u4e9b\u573a\u666f\uff0c\u6211\u4eec\u9009\u62e9\u901a\u8fc7\u67b6\u6784\u97e7\u6027\u6765\u4fdd\u7559\u8fd9\u4e9b\u529f\u80fd\uff0c\u6bd4\u5982\u5c06\u63d0\u4f9bSseEmitter\u3001WebSocket\u529f\u80fd\u7684\u72ec\u7acb\u51fa\u5fae\u670d\u52a1\uff0c\u91c7\u7528Spring Boot\u5f00\u53d1\uff0c\u8fd9\u4e9b\u5e94\u7528\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528Java Chassis\u5fae\u670d\u52a1\u7684REST\u63a5\u53e3\u6765\u5b9e\u73b0\u5176\u7279\u6b8a\u529f\u80fd\u3002\u901a\u8fc7\u8fd9\u79cd\u67b6\u6784\u97e7\u6027\u7684\u7406\u5ff5\uff0c\u964d\u4f4e\u4e86\u6280\u672f\u6301\u7eed\u6f14\u8fdb\u7684\u5305\u88b1\uff0c\u4e3a\u654f\u6377\u8fed\u4ee3\uff0c\u6301\u7eed\u521b\u65b0\u5960\u5b9a\u4e86\u65b9\u5411\uff0c\u51cf\u5c11\u4e86\u517c\u5bb9\u6027\u95ee\u9898\u7684\u4e89\u8bba\u3002 </p>"},{"location":"featured-topics/secrets/load-balancer.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u8d1f\u8f7d\u5747\u8861\u9009\u62e9\u5668","text":"<p>\u8d1f\u8f7d\u5747\u8861\u7528\u4e8e\u7ba1\u7406\u5fae\u670d\u52a1\u5b9e\u4f8b\u4e4b\u95f4\u7684\u8bbf\u95ee\u7b56\u7565\u3002\u5b83\u8d1f\u8d23\u5728\u6bcf\u6b21\u8bf7\u6c42\u4e2d\u9ad8\u6548\u9009\u62e9\u76ee\u6807\u5b9e\u4f8b\uff0c\u5e76\u4fdd\u6301\u8bf7\u6c42\u5728\u591a\u4e2a\u76ee\u6807\u5b9e\u4f8b\u4e2d\u5747\u8861\u3002\u76ee\u6807\u5b9e\u4f8b\u9009\u62e9\u8fc7\u7a0b\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u7684\u793a\u4f8b\u56fe\u7b80\u5355\u5c55\u793a\uff1a</p> <p></p> <p>AZ\u4eb2\u548c\u662f\u5e38\u89c1\u7684\u9009\u62e9\u5668\u4e4b\u4e00\u3002\u5b83\u6839\u636e\u672c\u5b9e\u4f8b\u7684AZ\u4fe1\u606f\u548c\u76ee\u6807\u5b9e\u4f8b\u7684AZ\u4fe1\u606f\uff0c\u786e\u5b9a\u5408\u9002\u7684\u76ee\u6807\u5b9e\u4f8b\u5b50\u96c6\uff0c\u5b9e\u4f8b\u5b50\u96c6\u4e0e\u672c\u5b9e\u4f8b\u5177\u6709\u76f8\u540c\u7684AZ\u4fe1\u606f\u3002</p> <p>\u8d1f\u8f7d\u5747\u8861\u9009\u62e9\u5668\u662f\u4e00\u4e2a\u5178\u578b\u7684\u804c\u8d23\u94fe\u6a21\u5f0f\u3002</p> <ul> <li>Ribbon \u7684\u804c\u8d23\u94fe</li> </ul> <pre><code>public interface ServerListFilter&lt;T extends Server&gt; {\n List&lt;T&gt; getFilteredListOfServers(List&lt;T&gt; servers);\n}\n</code></pre> <ul> <li>Spring Cloud Commons \u7684\u804c\u8d23\u94fe</li> </ul> <pre><code>public abstract class DelegatingServiceInstanceListSupplier implements ServiceInstanceListSupplier, InitializingBean, DisposableBean {\n protected final ServiceInstanceListSupplier delegate;\n\n public DelegatingServiceInstanceListSupplier(ServiceInstanceListSupplier delegate) {\n this.delegate = delegate;\n }\n\n public ServiceInstanceListSupplier getDelegate() {\n return this.delegate;\n }\n}\n</code></pre> <ul> <li>Java Chassis \u7684\u804c\u8d23\u94fe</li> </ul> <pre><code>public interface DiscoveryFilter extends Ordered {\n DiscoveryTreeNode discovery(DiscoveryContext context, DiscoveryTreeNode parent);\n}\n</code></pre> <p>Java Chassis \u4f7f\u7528\u4e86\u6811\u578b\u7ed3\u6784\u7684\u804c\u8d23\u94fe\uff0c\u5b83\u7684\u5de5\u4f5c\u8fc7\u7a0b\u5982\u4e0b\uff1a</p> <ul> <li>\u5c06\u5b9e\u4f8b\u9884\u5206\u7ec4\u3002</li> <li>\u901a\u8fc7\u6811\u578b\u7ed3\u6784\u7d22\u5f15\uff0c\u5feb\u901f\u627e\u5230\u76ee\u6807\u5b9e\u4f8b\u96c6\u5408\u3002</li> <li>\u5f53\u67d0\u4e2a\u6811\u8282\u70b9\u4e3a\u7a7a\u7684\u573a\u666f\uff0c\u53ef\u4ee5\u8fd4\u56de\u4e0a\u5c42\u9009\u62e9\u5668\uff0c\u91cd\u65b0\u67e5\u627e\u3002 </li> </ul> <p>\u80fd\u591f\u5feb\u901f\u68c0\u7d22\u5230\u5b9e\u4f8b\u7684\u573a\u666f\uff1a</p> <p></p> <p>\u51fa\u73b0\u5b9e\u4f8b\u4e3a\u7a7a\u7684\u7684\u573a\u666f\uff1a</p> <p></p> <p>\u76f8\u5bf9\u4e8e\u7ebf\u6027\u7684\u804c\u8d23\u94fe\u6a21\u5f0f\uff0c\u6811\u578b\u804c\u8d23\u94fe\u6a21\u5f0f\u5b58\u5728\u4e24\u65b9\u9762\u660e\u663e\u7684\u4f18\u52bf\uff1a</p> <ul> <li>\u8ba1\u7b97\u590d\u6742\u5ea6\u4ece O(N) \u964d\u4f4e\u4e3a O(1)\u3002 \u5f53\u5b9e\u4f8b\u89c4\u6a21\u5f88\u5927\uff0c\u6bd4\u5982\u8d85\u8fc71000\u7684\u65f6\u5019\uff0c\u8be5\u7b97\u6cd5\u80fd\u591f\u6781\u5927\u7684\u964d\u4f4eCPU\u4f7f\u7528\u7387\uff0c\u51cf\u5c11\u5783\u573e\u56de\u6536\u7684\u6570\u91cf\u3002 </li> <li>\u80fd\u591f\u89e3\u51b3\u4e0a\u5c42\u9009\u62e9\u5668\u7684\u7ed3\u679c\u5728\u4e0b\u5c42\u9009\u62e9\u5668\u7684\u7ed3\u679c\u4e3a\u7a7a\u7684\u95ee\u9898\u3002\u6bd4\u5982\u5728AZ\u4eb2\u548c\u573a\u666f\uff0c\u5982\u679c\u672cAZ\u7684\u5b9e\u4f8b\u4e0d\u6ee1\u8db3\u540e\u7eed\u9009\u62e9\u5668\u7684\u6761\u4ef6\uff0c\u90a3\u4e48\u4f7f\u7528\u975e\u672cAZ\u7684\u5b9e\u4f8b\uff0c\u80fd\u591f\u786e\u4fdd\u672c\u6b21\u8bbf\u95ee\u7684\u6b63\u786e\u6027\uff0c\u964d\u4f4e\u9519\u8bef\u7387\uff0c\u4e5f\u80fd\u591f\u66f4\u597d\u7684\u6ee1\u8db3\u8bf7\u6c42\u5747\u8861\u7684\u8981\u6c42\u3002</li> </ul> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u5728\u67d0\u4e2a\u5ba2\u6237\u7684\u5b9e\u9645\u573a\u666f\u4e2d\uff0c\u5982\u679c\u5b9e\u4f8b\u6570\u8d85\u8fc71000\uff0c\u8d1f\u8f7d\u5747\u8861\u7684CPU\u6d88\u8017\u5360\u5230\u6574\u4e2a\u8bf7\u6c42\u5904\u7406\u65f6\u95f4\u768420%\u4ee5\u4e0a\uff0c\u968f\u7740\u5e94\u7528\u89c4\u6a21\u7684\u53d8\u5927\uff0c\u8d1f\u8f7d\u5747\u8861\u5904\u7406\u7b97\u6cd5\u7684\u6027\u80fd\u4f18\u5316\u53d8\u5f97\u66f4\u52a0\u91cd\u8981\u4e86\u3002 </p>"},{"location":"featured-topics/secrets/registries.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6613\u6269\u5c55\u7684\u591a\u79cd\u6ce8\u518c\u4e2d\u5fc3\u652f\u6301","text":"<p>Java Chassis \u7684\u65e9\u671f\u7248\u672c\u4f9d\u8d56\u4e8e Service Center\uff0c\u63d0\u4f9b\u4e86\u5f88\u591a\u5dee\u5f02\u5316\u7684\u7ade\u4e89\u529b\uff1a</p> <ul> <li>\u63a5\u53e3\u7ea7\u522b\u8f6c\u53d1\u3002 \u901a\u8fc7\u6ce8\u518c\u4e2d\u5fc3\u7ba1\u7406\u5fae\u670d\u52a1\u7684\u6bcf\u4e2a\u7248\u672c\u7684\u5143\u6570\u636e\uff0c\u7279\u522b\u662f\u5951\u7ea6\u6570\u636e\u3002 \u7ed3\u5408\u5951\u7ea6\u6570\u636e\uff0c\u80fd\u591f\u5b9e\u73b0\u7248\u672c\u7ea7\u522b\u7684\u8def\u7531\u80fd\u529b\u3002 \u6bd4\u5982\u4e00\u4e2a\u5fae\u670d\u52a1\u5b58\u5728 v1 \u548c v2 \u4e24\u4e2a\u7248\u672c\uff0c \u5176\u4e2d v1 \u7248\u672c\u5b58\u5728\u63a5\u53e3 op1, op2\uff0c v2 \u7248\u672c\u5b58\u5728\u63a5\u53e3 op1, op2, op3\uff0c \u5728\u7070\u5ea6\u573a\u666f\uff0c Java Chassis\u80fd\u591f\u81ea\u52a8\u5c06 op3 \u7684\u8bbf\u95ee\u8f6c\u53d1\u5230 v2 \u7248\u672c\uff0c\u5c06 op1, op2 \u7684\u8bbf\u95ee\u5728 v1, v2\u7248\u672c\u505a\u8d1f\u8f7d\u5747\u8861\u3002 </li> <li>\u57fa\u4e8e version-rule \u7684\u5b9e\u4f8b\u9009\u62e9\u3002 \u5ba2\u6237\u7aef\u80fd\u591f\u914d\u7f6e version-rule\uff0c \u6bd4\u5982 last, 2.0+\u7b49\u3002 \u8fd9\u6837\u5ba2\u6237\u7aef\u80fd\u591f\u6839\u636e\u5b9e\u9645\u60c5\u51b5\uff0c\u7b5b\u9009\u5b9e\u4f8b\u7684\u7248\u672c\u3002 </li> </ul> <p>Java Chassis\u8fc7\u5ea6\u4f9d\u8d56 Service Center\uff0c \u4e3a\u4ea7\u54c1\u7684\u53d1\u5c55\u5e26\u6765\u4e86\u4e00\u4e9b\u74f6\u9888\u3002 Java Chassis\u7684\u751f\u6001\u63a8\u5e7f\u4f9d\u8d56\u4e8e Service Center\u7684\u751f\u6001\u63a8\u5e7f\uff0c \u4e0d\u5229\u4e8eJava Chassis\u88ab\u66f4\u591a\u7528\u6237\u4f7f\u7528\u3002 \u968f\u7740\u4e91\u7684\u53d1\u5c55\uff0c \u8d8a\u6765\u8d8a\u591a\u7684\u5ba2\u6237\u4e5f\u671f\u671b\u4e00\u5957\u4ee3\u7801\uff0c\u80fd\u591f\u5728\u4e0d\u540c\u7684\u4e91\u73af\u5883\u8fd0\u884c\uff0c\u6709\u4e9b\u4e91\u4ea7\u5546\u672a\u63d0\u4f9bService Center\u8fd0\u884c\u73af\u5883\uff0c\u90a3\u4e48\u7528\u6237\u9009\u62e9Java Chassis \u5c31\u4f1a\u5b58\u5728\u987e\u8651\u3002 </p> <p>\u57fa\u4e8e\u4e0a\u8ff0\u539f\u56e0\uff0c Java Chassis\u7b80\u5316\u4e86\u6ce8\u518c\u53d1\u73b0\u7684\u4f9d\u8d56\uff0c\u5b9a\u4e49\u4e86\u7b80\u5355\u5bb9\u6613\u5b9e\u73b0\u7684\u63a5\u53e3\uff0c\u5e76\u57fa\u4e8e <code>Nacos</code> \u63d0\u4f9b\u4e86\u5b9e\u73b0\uff0c\u672a\u6765\u8fd8\u4f1a\u63d0\u4f9b <code>zookeeper</code> \u7b49\u5b9e\u73b0\u3002 Java Chassis \u91c7\u7528\u4e86\u4e00\u7cfb\u5217\u65b0\u7684\u8bbe\u8ba1\u6a21\u5f0f\uff0c \u4fdd\u8bc1\u4e86\u5728\u964d\u4f4e\u6ce8\u518c\u4e2d\u5fc3\u529f\u80fd\u4f9d\u8d56\u7684\u524d\u63d0\u4e0b\uff0c\u4e0d\u964d\u4f4e\u5e94\u7528\u81ea\u8eab\u7684\u53ef\u9760\u6027\u3002 </p>"},{"location":"featured-topics/secrets/registries.html#_1","title":"\u63a5\u53e3\u7ea7\u522b\u8f6c\u53d1\u7684\u66ff\u4ee3\u65b9\u6848","text":"<p>\u4f9d\u8d56\u4e8e Service Center\uff0c Java Chassis\u63d0\u4f9b\u4e86\u63a5\u53e3\u7ea7\u522b\u8f6c\u53d1\u3002 Java Chassis 3 \u9996\u5148\u505a\u7684\u4e00\u4e2a\u53d8\u5316\u662f\u5220\u9664\u4e86\u5bf9\u4e8e\u63a5\u53e3\u7ea7\u522b\u8f6c\u53d1\u7684\u652f\u6301\u3002 \u8fd9\u6837\u5bf9\u4e8e\u6ce8\u518c\u4e2d\u5fc3\u7684\u4f9d\u8d56\u590d\u6742\u5ea6\u81f3\u5c11\u53ef\u4ee5\u964d\u4f4e 70%\u3002 \u7136\u800c\u7070\u5ea6\u573a\u666f\u4f9d\u7136\u5bf9\u5f88\u591a\u4e1a\u52a1\u6bd4\u8f83\u91cd\u8981\uff0c Java Chassis 3\u4f7f\u7528\u7070\u5ea6\u53d1\u5e03\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002 \u4f7f\u7528\u7070\u5ea6\u53d1\u5e03\u7684\u597d\u5904\u662f\u4e0d\u7528\u4f9d\u8d56\u6ce8\u518c\u4e2d\u5fc3\u63d0\u4f9b\u7248\u672c\u5143\u6570\u636e\u7ba1\u7406\u80fd\u529b\uff0c\u53ea\u9700\u8981\u6bcf\u4e2a\u5b9e\u4f8b\u5177\u5907\u7248\u672c\u53f7\u7b49\u7b80\u5355\u5143\u6570\u636e\u4fe1\u606f\u3002 </p> <pre><code>servicecomb:\n # enable router for edge service\n router:\n type: router\n routeRule:\n business: |\n - precedence: 2\n match:\n apiPath:\n prefix: \"/business/v2\"\n route:\n - weight: 100\n tags:\n version: 2.0.0\n - precedence: 1\n match:\n apiPath:\n prefix: \"/business/v1/dec\"\n route:\n - weight: 50\n tags:\n version: 1.1.0\n - weight: 50\n tags:\n version: 2.0.0\n</code></pre>"},{"location":"featured-topics/secrets/registries.html#_2","title":"\u6ce8\u518c\u53d1\u73b0\u63a5\u53e3\u53ca\u5176\u5b9e\u73b0","text":"<p>Java Chassis 3 \u53ea\u9700\u8981\u4f7f\u7528 <code>Discovery</code> \u63a5\u53e3\u5c31\u80fd\u591f\u63d0\u4f9b\u65b0\u7684\u6ce8\u518c\u53d1\u73b0\u652f\u6301\u3002 Java Chassis\u4f1a\u8c03\u7528 <code>findServiceInstances</code> \u67e5\u8be2\u5b9e\u4f8b\uff0c\u5982\u679c\u540e\u7eed\u5b9e\u4f8b\u53d1\u751f\u53d8\u66f4\uff0c\u6ce8\u518c\u4e2d\u5fc3\u5b9e\u73b0\u901a\u8fc7 <code>InstanceChangedListener</code> \u901a\u77e5 Java Chassis. </p> <pre><code>/**\n * This is the core service discovery interface. &lt;br/&gt;\n */\npublic interface Discovery&lt;D extends DiscoveryInstance&gt; extends SPIEnabled, SPIOrder, LifeCycle {\n interface InstanceChangedListener&lt;D extends DiscoveryInstance&gt; {\n /**\n * Called by Discovery Implementations when instance list changed.\n * @param registryName Name of the calling discovery implementation\n * @param application Microservice application\n * @param serviceName Microservice name\n * @param updatedInstances The latest updated instances.\n */\n void onInstanceChanged(String registryName, String application, String serviceName, List&lt;D&gt; updatedInstances);\n }\n\n String name();\n\n /**\n * If this implementation enabled for this microservice.\n */\n boolean enabled(String application, String serviceName);\n\n /**\n * Find all instances.\n *\n * Life Cycle\uff1aThis method is called anytime after &lt;code&gt;run&lt;/code&gt;.\n *\n * @param application application\n * @param serviceName microservice name\n * @return all instances match the criteria.\n */\n List&lt;D&gt; findServiceInstances(String application, String serviceName);\n\n /**\n * Discovery can call InstanceChangedListener when instance get changed.\n */\n void setInstanceChangedListener(InstanceChangedListener&lt;D&gt; instanceChangedListener);\n}\n\n</code></pre> <p>Java Chassis 3 \u901a\u8fc7 <code>Registration</code> \u6765\u7ba1\u7406\u6ce8\u518c\uff0c \u6ce8\u518c\u8fc7\u7a0b\u5206\u4e3a <code>init</code>\u3001<code>run</code>\u3001<code>destroy</code>\u7b80\u5355\u7684\u751f\u547d\u5468\u671f\uff0c \u53ef\u4ee5\u5728 <code>init</code> \u51c6\u5907\u6ce8\u518c\u7684\u6570\u636e\uff0c <code>run</code> \u6267\u884c\u6ce8\u518c\uff0c <code>destroy</code> \u5219\u5728\u6ce8\u518c\u5931\u8d25\u6216\u8005\u7cfb\u7edf\u505c\u6b62\u7684\u65f6\u5019\u6267\u884c\u3002 </p> <pre><code>/**\n * This is the core service registration interface. &lt;br/&gt;\n */\npublic interface Registration&lt;R extends RegistrationInstance&gt; extends SPIEnabled, SPIOrder, LifeCycle {\n String name();\n\n /**\n * get MicroserviceInstance &lt;/br&gt;\n *\n * Life Cycle\uff1aThis method is called anytime after &lt;code&gt;run&lt;/code&gt;.\n */\n R getMicroserviceInstance();\n\n /**\n * update MicroserviceInstance status &lt;/br&gt;\n *\n * Life Cycle\uff1aThis method is called anytime after &lt;code&gt;run&lt;/code&gt;.\n */\n boolean updateMicroserviceInstanceStatus(MicroserviceInstanceStatus status);\n\n /**\n * adding schemas to Microservice &lt;/br&gt;\n *\n * Life Cycle\uff1aThis method is called after &lt;code&gt;init&lt;/code&gt; and before &lt;code&gt;run&lt;/code&gt;.\n */\n void addSchema(String schemaId, String content);\n\n /**\n * adding endpoints to MicroserviceInstance &lt;/br&gt;\n *\n * Life Cycle\uff1aThis method is called after &lt;code&gt;init&lt;/code&gt; and before &lt;code&gt;run&lt;/code&gt;.\n */\n void addEndpoint(String endpoint);\n\n /**\n * adding property to MicroserviceInstance &lt;/br&gt;\n *\n * Life Cycle\uff1aThis method is called after &lt;code&gt;init&lt;/code&gt; and before &lt;code&gt;run&lt;/code&gt;.\n */\n void addProperty(String key, String value);\n}\n\n</code></pre>"},{"location":"featured-topics/secrets/registries.html#_3","title":"\u6ce8\u518c\u53d1\u73b0\u7684\u7ec4\u5408","text":"<p>Java Chassis 3\u53ef\u4ee5\u72ec\u7acb\u5b9e\u73b0\u591a\u4e2a <code>Discovery</code> \u548c <code>Registration</code>, \u8fbe\u5230\u5411\u591a\u4e2a\u6ce8\u518c\u4e2d\u5fc3\u6ce8\u518c\u548c\u4ece\u591a\u4e2a\u6ce8\u518c\u4e2d\u5fc3\u53d1\u73b0\u5b9e\u4f8b\u7684\u4f5c\u7528\u3002 \u6bcf\u4e2a\u5b9e\u4f8b\u6839\u636e\u5b9e\u4f8bID\u552f\u4e00\u6765\u6807\u8bc6\u3002 \u5982\u679c\u5b9e\u4f8bID\u76f8\u540c\uff0c \u4f1a\u88ab\u8ba4\u4e3a\u662f\u540c\u4e00\u4e2a\u5b9e\u4f8b\uff0c \u5982\u679c\u4e0d\u540c\uff0c \u5219\u4f1a\u8ba4\u4e3a\u662f\u4e0d\u540c\u7684\u5b9e\u4f8b\u3002 \u5728 <code>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb</code> \u4e2d\u804a\u5230\u4e86\uff0c Java Chassis \u8981\u6c42\u6bcf\u6b21\u5b9e\u4f8b\u6ce8\u518c\uff08\u65b0\u7684\u8fdb\u7a0b\uff09\uff0c \u751f\u6210\u552f\u4e00\u7684\u5b9e\u4f8bID\uff0c \u4ee5\u89e3\u51b3\u6ce8\u518c\u5206\u533a\u9694\u79bb\u5e26\u6765\u7684\u5b9e\u4f8b\u5047\u4e0b\u7ebf\u95ee\u9898\u3002 <code>Discovery</code> \u548c <code>Registration</code> \u90fd\u5305\u542b\u4e86 Java Chassis \u5b9a\u4e49\u7684\u57fa\u7840\u4fe1\u606f\u3002</p> <pre><code>/**\n * Standard information used for microservice instance registration and discovery.\n */\npublic interface MicroserviceInstance {\n /**\n * Environment(Required): Used for logic separation of microservice instance. Only\n * microservice instance with same environment can discovery each other.\n */\n String getEnvironment();\n\n /**\n * Application(Required): Used for logic separation of microservice instance. Only\n * microservice instance with same application can discovery each other.\n */\n String getApplication();\n\n /**\n * Service Name(Required): Unique identifier for microservice.\n */\n String getServiceName();\n\n /**\n * Service Name Alias(Optional): Unique identifier for microservice.\n * This alias is used by registry implementation to support rename\n * of a microservice, e.g. old consumers use old service name can\n * find a renamed microservice service.\n */\n String getAlias();\n\n /**\n * Service Version(Required): version of this microservice.\n */\n String getVersion();\n\n /**\n * Data center info(Optional).\n */\n DataCenterInfo getDataCenterInfo();\n\n /**\n * Service Description(Optional)\n */\n String getDescription();\n\n /**\n * Service Properties(Optional)\n */\n Map&lt;String, String&gt; getProperties();\n\n /**\n * Service Schemas(Optional): Open API information.\n */\n Map&lt;String, String&gt; getSchemas();\n\n /**\n * Service endpoints(Optional).\n */\n List&lt;String&gt; getEndpoints();\n\n /**\n * Microservice instance id(Required). This id can be generated when microservice instance is starting\n * or assigned by registry implementation.\n *\n * When microservice instance is restarted, this id should be changed.\n */\n String getInstanceId();\n\n /**\n * Microservice service id(Optional). This is used for service center, other implementations may not\n * support service id.\n */\n default String getServiceId() {\n return \"\";\n }\n}\n\n</code></pre> <p>\u5728\u5b9e\u73b0\u6ce8\u518c\u53d1\u73b0\u7684\u65f6\u5019\uff0c\u9700\u8981\u4fdd\u8bc1\u8be5\u63a5\u53e3\u5b9a\u4e49\u7684\u57fa\u7840\u4fe1\u606f\u80fd\u591f\u6ce8\u518c\u5230\u6ce8\u518c\u4e2d\u5fc3\uff0c\u67e5\u8be2\u5b9e\u4f8b\u7684\u65f6\u5019\uff0c\u80fd\u591f\u83b7\u53d6\u5230\u8fd9\u4e9b\u4fe1\u606f\u3002 </p> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u4e0d\u628a\u9e21\u86cb\u653e\u5230\u540c\u4e00\u4e2a\u7bee\u5b50\u91cc\u9762\uff0c\u662f\u6280\u672f\u9009\u578b\u91cc\u9762\u5f88\u91cd\u8981\u7684\u8003\u91cf\u3002\u89e3\u51b3\u65b9\u6848\u7684\u5f00\u653e\u6027\u548c\u53ef\u66ff\u4ee3\u6027\u3001\u4e91\u670d\u52a1\u7684\u53ef\u66ff\u4ee3\u6027\uff0c\u662f\u5f88\u591a\u5ba2\u6237\u90fd\u5173\u6ce8\u7684\u95ee\u9898\u3002\u5bf9\u4e8e\u4e00\u4e2a\u5f00\u6e90\u7684\u6280\u672f\u6846\u67b6\uff0cJava Chassis\u65e9\u671f\u7684\u7248\u672c\u867d\u7136\u8bbe\u8ba1\u4e0a\u4e5f\u652f\u6301\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u6269\u5c55\uff0c\u4f46\u662f\u5b9e\u73b0\u96be\u5ea6\u5f88\u9ad8\uff0c\u4e0d\u81ea\u89c9\u7684\u628a\u5ba2\u6237\u4f7f\u7528\u5176\u4ed6\u6ce8\u518c\u4e2d\u5fc3\u66ff\u6362 service center\u7684\u8981\u6c42\u53d8\u5f97\u4e0d\u53ef\u884c\u3002\u63d0\u4f9b\u66f4\u52a0\u7b80\u5316\u7684\u6ce8\u518c\u53d1\u73b0\u5b9e\u73b0\uff0c\u867d\u7136\u51cf\u5c11\u4e86\u5c11\u91cf\u6709\u6709\u7ade\u4e89\u529b\u7684\u529f\u80fd\u7279\u6027\uff0c\u4f46\u662f\u6781\u5927\u964d\u4f4e\u4e86\u5ba2\u6237\u9009\u578b\u7684\u987e\u8651\u3002 </p>"},{"location":"featured-topics/secrets/serialization.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u591a\u79cd\u5e8f\u5217\u5316\u65b9\u5f0f\u652f\u6301","text":"<p>\u6253\u5f00\u4e00\u4e2a\u7b80\u5355\u7684 <code>REST</code> \u63a5\u53e3\uff1a</p> <pre><code>@RestSchema(schemaId = \"ProviderController\")\n@RequestMapping(path = \"/\")\npublic class ProviderController {\n @PostMapping(\"/benchmark\")\n public DataModel sayHello(@RequestHeader(\"wait\") int wait, @RequestBody DataModel dataModel) {\n if (wait &gt; 0) {\n Thread.sleep(wait);\n }\n return dataModel;\n }\n}\n</code></pre> <p>\u7684<code>\u5951\u7ea6</code>:</p> <pre><code>openapi: 3.0.1\ninfo:\n title: swagger definition for org.apache.servicecomb.samples.ProviderController\n version: 1.0.0\nservers:\n- url: /\npaths:\n /benchmark:\n post:\n operationId: sayHello\n parameters:\n - name: wait\n in: header\n required: true\n schema:\n type: integer\n format: int32\n requestBody:\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/DataModel'\n application/protobuf:\n schema:\n $ref: '#/components/schemas/DataModel'\n text/plain:\n schema:\n $ref: '#/components/schemas/DataModel'\n required: true\n x-name: dataModel\n responses:\n \"200\":\n description: response of 200\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/DataModel'\n application/protobuf:\n schema:\n $ref: '#/components/schemas/DataModel'\n text/plain:\n schema:\n $ref: '#/components/schemas/DataModel'\ncomponents:\n schemas:\n ChildDataModel:\n type: object\n properties:\n numInt:\n type: integer\n format: int32\n numLong:\n type: integer\n format: int64\n numDouble:\n type: number\n format: double\n numFloat:\n type: number\n format: float\n data:\n type: string\n x-java-class: org.apache.servicecomb.samples.ChildDataModel\n DataModel:\n type: object\n properties:\n data:\n type: object\n additionalProperties:\n $ref: '#/components/schemas/ChildDataModel'\n x-java-class: org.apache.servicecomb.samples.DataModel\n</code></pre> <p>\u53ef\u4ee5\u770b\u5230 Java Chassis\u4f7f\u7528\u4e86Open API 3.0.1\u7684\u534f\u8bae\u89c4\u8303\uff0c<code>Request Body</code> \u548c <code>responses</code> \u589e\u52a0\u4e86 <code>application/protobuf</code> \u3001 <code>text/plain</code> \u7684\u652f\u6301\u3002 \u8fd9\u79cd\u4f7f\u7528\u5f62\u5f0f\uff0c\u5960\u5b9a\u4e86Java Chassis 3\u591a\u5e8f\u5217\u5316\u652f\u6301\u65b9\u5f0f\u7684\u57fa\u7840\uff0c\u7ec6\u5fc3\u7684\u8bfb\u8005\u5e94\u8be5\u5f88\u5feb\u80fd\u591f\u53d1\u73b0\u8fd9\u79cd\u65b9\u5f0f\u4e0e\u5176\u4ed6\u652f\u6301\u591a\u5e8f\u5217\u5316\u6846\u67b6\u4e4b\u95f4\u7684\u5dee\u5f02\u3002 </p> <ul> <li>Spring Boot</li> </ul> <p>\u652f\u6301\u591a\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u9700\u8981\u5b9e\u73b0 <code>HttpMessageConverter</code> \u63a5\u53e3\uff0c\u5e76\u5728 <code>Controller</code> \u58f0\u660e\u652f\u6301\u7684 <code>Content-Type</code>\u3002 \u5982\u679c\u4f7f\u7528 <code>Spring Fox</code> \u6216\u8005 <code>Spring Doc</code> \u7b49 Open API\u5de5\u5177\u751f\u6210\u5951\u7ea6\uff0c\u5951\u7ea6\u5185\u5bb9\u53ea\u4f1a\u5305\u542b <code>Controller</code> \u58f0\u660e\u7684\u5e8f\u5217\u5316\u7c7b\u578b\u3002 Spring Boot\u5b58\u5728\u9690\u5f0f\u7684\u5951\u7ea6\u60c5\u51b5\uff0c\u8fd9\u610f\u5473\u7740\u5951\u7ea6\u5e76\u4e0d\u80fd\u5b8c\u5168\u4ee3\u8868 <code>Controller</code> \u670d\u52a1\u7684\u80fd\u529b\u3002 \u5982\u679c\u9700\u8981\u5bf9\u63a5\u53e3\u589e\u52a0\u6216\u8005\u51cf\u5c11\u5e8f\u5217\u5316\u652f\u6301\uff0c\u90fd\u9700\u8981\u4fee\u6539\u4ee3\u7801\u3002 </p> <ul> <li>Dubbo</li> </ul> <p>Dubbo \u9700\u8981\u5728 Provider \u4f7f\u7528 <code>dubbo:protocol</code> \u58f0\u660e\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c \u5728Consumer\u4f7f\u7528 <code>dubbo:reference</code> \u58f0\u660e\u5e8f\u5217\u5316\u65b9\u5f0f\u3002 \u7531\u4e8e Dubbo \u662f\u57fa\u4e8e<code>IDL</code>\u7684\u5951\u7ea6\u7cfb\u7edf\uff0c \u5728\u4f7f\u7528 RPC \u7684\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u52a8\u6001\u8c03\u6574\u5e8f\u5217\u5316\u65b9\u5f0f\u3002 <code>REST</code> \u652f\u6301\u5728 Dubbo \u662f\u5b8c\u5168\u72ec\u7acb\u7684\u5355\u5143\uff0c \u5e8f\u5217\u5316\u65b9\u5f0f\u4e5f\u72ec\u7acb\u4e8e RPC \u63a5\u53e3\uff0c <code>RPC</code> \u548c <code>REST</code> \u4e0d\u80fd\u4e92\u64cd\u4f5c\u3002 </p> <p>Open API\u57fa\u4e8e <code>REST</code> \u7684\u8bed\u4e49\uff0c\u6765\u652f\u6301 <code>IDL</code> \u7684\u8bed\u4e49\u3002 Java Chassis\u80fd\u591f\u66f4\u52a0\u76f4\u89c2\u7684\u652f\u6301\u901a\u8fc7\u7b2c\u4e09\u65b9\u5de5\u5177\u4ee5HTTP\u534f\u8bae\u65cf\u8bbf\u95ee\u5fae\u670d\u52a1\uff0c \u53ea\u9700\u8981\u6309\u7167\u5951\u7ea6\u7684\u63cf\u8ff0\u6784\u9020HTTP\u7684\u62a5\u6587\u3002 \u5728\u7f16\u7801\u4fa7\uff0c Java Chassis\u7684\u5ba2\u6237\u7aef\u53ef\u4ee5\u4f7f\u7528 REST \u8bed\u4e49\u7684\u63a5\u53e3\uff0c\u5982 <code>RestOperations</code>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528 RPC \u8bed\u4e49\u7684\u63a5\u53e3\u8bbf\u95ee\u670d\u52a1\u7aef\u3002 </p> <p>\u5b9a\u4e49\u670d\u52a1\u7aef\u63a5\u53e3\uff1a</p> <pre><code>public interface ProviderService {\n DataModel sayHello(int wait, DataModel dataModel);\n}\n</code></pre> <p>\u901a\u8fc7RPC\u8bbf\u95ee\uff1a</p> <pre><code>@RestSchema(schemaId = \"ConsumerController\")\n@RequestMapping(path = \"/\")\npublic class ConsumerController {\n @RpcReference(schemaId = \"ProviderController\", microserviceName = \"provider\")\n private ProviderService providerService;\n\n @PostMapping(\"/benchmark\")\n public DataModel sayHello(@RequestHeader(\"wait\") int wait, @RequestBody DataModel dataModel) {\n return providerService.sayHello(wait, dataModel);\n }\n}\n</code></pre> <p>Java Chassis\u4ee5OpenAPI\u4e3a\u57fa\u7840\u7684Edge Service\u90e8\u4ef6\uff0c\u80fd\u591f\u5b9e\u73b0\u8bf7\u6c42\u5728\u901a\u4fe1\u534f\u8bae\u3001\u5e8f\u5217\u5316\u65b9\u5f0f\u4e0a\u7684\u81ea\u52a8\u8f6c\u6362\u3002\u6bd4\u5982\u5c06HTTP\u534f\u8bae\u8f6cHighway\u534f\u8bae\u3001application/json\u8f6capplication/protobuf\u7b49\u3002 </p> <p>\u57fa\u4e8e Java Chassis Benchmark \uff0c\u505a\u4e00\u4e2a\u7b80\u5355\u6027\u80fd\u6d4b\u8bd5\u3002\u8be5\u6d4b\u8bd5\u5bf9\u6bd4\u4e86\u4e24\u79cd\u573a\u666f\uff1a</p> <p></p> <p>\u573a\u666f\u4e00\u7684\u9ed8\u8ba4\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n rest:\n parameter:\n default-request-encoding: \"application/json\"\n default-response-encoding: \"application/json\"\n</code></pre> <p>\u573a\u666f\u4e8c\u7684\u9ed8\u8ba4\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n rest:\n parameter:\n default-request-encoding: \"application/protobuf\"\n default-response-encoding: \"application/protobuf\"\n</code></pre> <p>\u6d4b\u8bd5\u7ed3\u679c\u53c2\u8003\u4e0b\u8868\u3002\u8be5\u6570\u636e\u4e3b\u8981\u7528\u4e8e\u8bf4\u660e\u5e8f\u5217\u5316\u5dee\u5f02\uff0c\u56e0\u6b64\u7701\u53bb\u4e86\u6d4b\u8bd5\u73af\u5883\u7684\u63cf\u8ff0\u3002\u4e0b\u8868\u7684\u5e73\u5747\u65f6\u5ef6\u7edf\u8ba1\u4e86\u6d4b\u8bd5\u5ba2\u6237\u7aef\u8ba1\u7b97\u7684\u8bf7\u6c42-\u54cd\u5e94\u65f6\u95f4\u7684\u5e73\u5747\u503c\u3002 </p> \u7248\u672c \u6570\u636e\u5355\u4f4d \u7b49\u5f85\u65f6\u95f4 \u7ebf\u7a0b\u6570 \u6267\u884c\u6b21\u6570 \u6267\u884c\u65f6\u95f4 \u5e73\u5747\u65f6\u5ef6 protobuffer 1 0 10 1000 6642 6 protobuffer 100 0 10 1000 9418 9 protobuffer 1000 0 10 1000 25205 24 protobuffer 1 10 10 1000 15432 15 protobuffer 100 10 10 1000 15965 15 protobuffer 1000 10 10 1000 25926 25 protobuffer 1 100 10 1000 105727 105 protobuffer 100 100 10 1000 106376 106 protobuffer 1000 100 10 1000 114452 114 jason 1 0 10 1000 6736 6 jason 100 0 10 1000 15063 14 jason 1000 0 10 1000 69757 68 jason 1 10 10 1000 16632 16 jason 100 10 10 1000 20033 19 jason 1000 10 10 1000 66104 65 jason 1 100 10 1000 104868 104 jason 100 100 10 1000 107439 107 jason 1000 100 10 1000 132786 131 <p>\u4ece\u8fd9\u7ec4\u6570\u636e\u53ef\u4ee5\u770b\u51fa\uff1a</p> <ul> <li>\u5728\u6570\u636e\u91cf\u6bd4\u8f83\u5c0f\u7684\u573a\u666f\u4e0b\uff0c\u4f7f\u7528 <code>json</code> \u548c <code>proto-buffer</code> \u6027\u80fd\u5dee\u5f02\u5f88\u5c0f\u3002 \u5728\u6570\u636e\u91cf\u6bd4\u8f83\u5927\u7684\u60c5\u51b5\u4e0b\uff0c<code>proto-buffer</code> \u7684\u6027\u80fd\u660e\u663e\u597d\u4e8e <code>json</code>\u3002 </li> <li>\u5728\u4e1a\u52a1\u65f6\u5ef6\u6bd4\u8f83\u5927\uff08&gt;100ms\uff09\u7684\u65f6\u5019\uff0c \u5e8f\u5217\u5316\u7684\u65f6\u5ef6\u53ef\u4ee5\u5ffd\u7565\u3002 </li> </ul> <p>\u4e0d\u540c\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u9664\u4e86\u6027\u80fd\u5dee\u5f02\uff0c\u5728\u53ef\u7ef4\u62a4\u65b9\u9762\u4e5f\u4f1a\u5b58\u5728\u5f88\u5927\u7684\u5dee\u5f02\u3002\u6bd4\u5982 <code>proto-buffer</code> \u5728\u517c\u5bb9\u6027\u65b9\u9762\u7684\u8868\u73b0\u4f1a\u6bd4 <code>json</code> \u5dee\uff0c\u5f53\u4fee\u6539\u63a5\u53e3\u5b9a\u4e49\u7684\u65f6\u5019\uff0c \u6bd4\u5982\u589e\u52a0\u5c5e\u6027\u3001\u5220\u9664\u5c5e\u6027\u3001\u4fee\u6539\u5c5e\u6027\u7b49\uff0c<code>proto-buffer</code> \u66f4\u5bb9\u6613\u5bfc\u81f4\u517c\u5bb9\u6027\u95ee\u9898\uff0c\u505a\u597d\u517c\u5bb9\u6027\u9632\u8303\u5bf9\u591a\u6570\u7528\u6237\u800c\u8a00\uff0c\u90fd\u662f\u6bd4\u8f83\u56f0\u96be\u7684\u4e8b\u60c5\u3002 </p> <p>\u652f\u6301\u591a\u534f\u8bae\u3001\u591a\u5e8f\u5217\u5316\u65b9\u5f0f\u7684\u53e6\u5916\u4e00\u4e2a\u8003\u8651\uff0c\u662f\u5bf9\u63a5\u9057\u7559\u7cfb\u7edf\u3002\u5bf9\u63a5\u9057\u7559\u7cfb\u7edf\u4f1a\u80cc\u8d1f\u5927\u91cf\u5386\u53f2\u503a\u52a1\uff0c\u4f7f\u5f97\u65b0\u7cfb\u7edf\u672c\u8eab\u8bbe\u8ba1\u504f\u79bb\u9884\u671f\u7684\u65b9\u5411\u3002\u5728 Java Chassis \u591a\u5e8f\u5217\u5316\u65b9\u5f0f\u7684\u9009\u62e9\u4e0a\uff0c \u53ea\u63d0\u4f9b\u4e86\u76ee\u524d\u5e7f\u6cdb\u4f7f\u7528\u7684 <code>json</code> \u548c <code>proto-buffer</code> \u652f\u6301\uff0c \u800c\u6ca1\u6709\u9009\u62e9\u652f\u6301\u5176\u4ed6\u5e8f\u5217\u5316\u65b9\u6848\u3002 \u4ee5\u67b6\u6784\u7684\u97e7\u6027\u53bb\u5904\u7406\u9057\u7559\u7cfb\u7edf\u95ee\u9898\uff0c\u662f Java Chassis\u575a\u6301\u7684\u4e00\u4e2a\u91cd\u8981\u8bbe\u8ba1\u7406\u5ff5\uff0c\u5bf9\u63a5\u9057\u7559\u7cfb\u7edf\u6216\u8005\u4fdd\u6301\u4e0e\u9057\u7559\u7cfb\u7edf\u7684\u517c\u5bb9\uff0c\u4e0d\u662f\u5b83\u7684\u4e3b\u8981\u8bbe\u8ba1\u76ee\u6807\u3002 </p> <p></p> <p>\u5728\u5e8f\u5217\u5316\u65b9\u5f0f\u9009\u62e9\u4e0a\uff0c\u7b80\u5355\u7684\u603b\u7ed3\u5982\u4e0b\uff1a</p> <ul> <li>\u4f7f\u7528 <code>REST</code> \u534f\u8bae\u662f\u7edd\u5927\u591a\u6570\u573a\u666f\u7684\u6700\u4f18\u9009\u62e9\uff0c\u80fd\u591f\u6700\u597d\u7684\u517c\u987e\u6027\u80fd\u3001\u53ef\u9760\u6027\u3001\u97e7\u6027\u7b49\u65b9\u9762\u7684\u8981\u6c42\u3002</li> <li>\u5bf9\u4e8e\u6570\u636e\u91cf\u6bd4\u8f83\u5927\uff0c\u4e1a\u52a1\u65f6\u5ef6\u5f88\u4f4e(&lt;100ms)\uff0c\u5e76\u4e14\u4e1a\u52a1\u6bd4\u8f83\u7a33\u5b9a\uff0c\u4e1a\u52a1\u63a5\u53e3\u4e0d\u9700\u8981\u9891\u7e41\u53d8\u52a8\u7684\u573a\u666f\uff0c\u53ef\u4ee5\u91c7\u7528 <code>proto-buffer</code>\u6765\u4f18\u5316\u6027\u80fd\uff0c\u6309\u9700\u8c03\u6574\u3002</li> </ul> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u67d0\u4e2a\u5ba2\u6237\u7684\u5173\u952e\u6838\u5fc3\u7cfb\u7edf\u5bf9\u4e8e\u65f6\u5ef6\u8981\u6c42\u5f88\u9ad8\uff0c\u56e0\u6b64\u9700\u8981\u91c7\u7528\u79c1\u6709\u534f\u8bae\u548c\u5e8f\u5217\u5316\u65b9\u5f0f\u6765\u63d0\u5347\u6027\u80fd\u3002\u4f46\u662f\u5bf9\u4e8e\u4e00\u4e9b\u975e\u6838\u5fc3\u7cfb\u7edf\uff0c\u9700\u8981\u4f7f\u7528REST\u63a5\u53e3\uff0c\u65b9\u4fbf\u65e5\u5e38\u5f00\u53d1\u3001\u8c03\u8bd5\u3002Java Chassis\u7684\u89e3\u8026\u8bbe\u8ba1\u4f7f\u5f97\u5ba2\u6237\u65e0\u9700\u5bf9\u4ee3\u7801\u8fdb\u884c\u4efb\u4f55\u6539\u9020\uff0c\u5c31\u53ef\u4ee5\u6ee1\u8db3\u4e24\u65b9\u9762\u7684\u8981\u6c42\u3002</p>"},{"location":"featured-topics/secrets/zone-isolation.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb","text":"<p>\u6ce8\u518c\u4e2d\u5fc3\u8d1f\u8d23\u5b9e\u4f8b\u7684\u6ce8\u518c\u548c\u53d1\u73b0\uff0c\u5bf9\u5fae\u670d\u52a1\u53ef\u9760\u8fd0\u884c\u8d77\u5230\u4e3e\u8db3\u8f7b\u91cd\u7684\u4f5c\u7528\u3002\u5b9e\u4f8b\u53d8\u66f4\u611f\u77e5\u5468\u671f\u662f\u6ce8\u518c\u4e2d\u5fc3\u6700\u91cd\u8981\u7684\u6280\u672f\u6307\u6807\u4e4b\u4e00\u3002\u611f\u77e5\u5468\u671f\u4ee3\u8868\u63d0\u4f9b\u8005\u7684\u5b9e\u4f8b\u6ce8\u518c\u6216\u8005\u4e0b\u7ebf\u540e\uff0c\u6d88\u8d39\u8005\u611f\u77e5\u5b9e\u4f8b\u6ce8\u518c\u6216\u8005\u4e0b\u7ebf\u7684\u5468\u671f\u3002\u5f71\u54cd\u5b9e\u4f8b\u53d8\u66f4\u611f\u77e5\u5468\u671f\u7684\u6280\u672f\u56e0\u7d20\u6709\u5f88\u591a\u3002</p> <ul> <li>\u6570\u636e\u4e00\u81f4\u6027\u3002\u4e00\u81f4\u6027\u6307\u5b9e\u4f8b\u5728\u6ce8\u518c\u4e2d\u5fc3\u7684\u4e00\u4e2a\u8282\u70b9\u6ce8\u518c\uff0c\u4ece\u6ce8\u518c\u4e2d\u5fc3\u7684\u4e0d\u540c\u8282\u70b9\u80fd\u5426\u540c\u65f6\u8bfb\u53d6\u5230\u5b9e\u4f8b\u7684\u6ce8\u518c\u4fe1\u606f\u3002\u8fd9\u4e2a\u6280\u672f\u56e0\u7d20\u5bf9\u4e8e\u5b9e\u4f8b\u53d8\u66f4\u611f\u77e5\u5468\u671f\u6709\u4e00\u5b9a\u5f71\u54cd\uff0c\u6bd4\u5982\u6700\u7ec8\u4e00\u81f4\u6027\u7684\u611f\u77e5\u901f\u5ea6\u4f1a\u6162\uff0c\u5f3a\u4e00\u81f4\u6027\u7684\u611f\u77e5\u901f\u5ea6\u4f1a\u5feb\u3002\u4f46\u591a\u6570\u573a\u666f\uff0c\u8fd9\u4e2a\u6280\u672f\u6307\u6807\u4e0d\u662f\u6838\u5fc3\u56e0\u7d20\u3002</li> <li>\u53d8\u66f4\u901a\u77e5\u673a\u5236\u3002\u53d8\u66f4\u901a\u77e5\u673a\u5236\u6307\u6d88\u8d39\u8005\u83b7\u53d6\u6700\u65b0\u5b9e\u4f8b\u5217\u8868\u7684\u65b9\u5f0f\uff0c\u901a\u5e38\u6709\u51e0\u79cd\u65b9\u5f0f\uff1a\u5b9a\u671fPull\u7684\u65b9\u5f0f\uff0c\u6d88\u8d39\u8005\u5468\u671f\u6027\u7684\u4ece\u6ce8\u518c\u4e2d\u5fc3\u67e5\u8be2\u5b9e\u4f8b\u5217\u8868\uff1b\u6ce8\u518c\u4e2d\u5fc3Push\u7684\u65b9\u5f0f\uff0c\u6ce8\u518c\u4e2d\u5fc3\u901a\u8fc7\u957f\u8fde\u63a5\u3001WebSocket\u7b49\u534f\u8bae\uff0c\u5c06\u5b9e\u4f8b\u53d8\u5316\u901a\u77e5\u6d88\u8d39\u8005\u3002\u5b9a\u671fPull\u7684\u65b9\u5f0f\u611f\u77e5\u5468\u671f\u76f8\u5bf9\u8f83\u957f\uff0c\u5de5\u4f5c\u673a\u5236\u6bd4\u8f83\u53ef\u9760\uff0c\u5bb9\u9519\u6548\u7387\u9ad8\uff0c\u5bf9\u4e8e\u7f51\u7edc\u8981\u6c42\u4f4e\uff0c\u66f4\u52a0\u5b89\u5168\uff1b\u6ce8\u518c\u4e2d\u5fc3Push\u7684\u65b9\u5f0f\u611f\u77e5\u5468\u671f\u5f88\u77ed\uff0c\u5bb9\u6613\u51fa\u73b0\u4e8b\u4ef6\u9519\u4e71\u6216\u8005\u5806\u79ef\uff0c\u5bf9\u4e8e\u7f51\u7edc\u89c4\u5212\u6709\u4e00\u5b9a\u8981\u6c42\u3002</li> <li>\u6ce8\u518c\u4e2d\u5fc3\u68c0\u6d4b\u5b9e\u4f8b\u72b6\u6001\u7684\u65b9\u5f0f\u3002\u6ce8\u518c\u4e2d\u5fc3\u68c0\u6d4b\u5b9e\u4f8b\u72b6\u6001\u7684\u65b9\u5f0f\u8868\u793a\u5982\u4f55\u5224\u65ad\u5b9e\u4f8b\u7684\u72b6\u6001\u662f\u6b63\u5e38\u8fd8\u662f\u5f02\u5e38\u3002\u6bd4\u5982Service Center\u9700\u8981\u5b9e\u4f8b\u5b9a\u671f\u7684\u53d1\u9001\u5fc3\u8df3\uff0c\u5982\u679c\u57283\u4e2a\u5fc3\u8df3\u5468\u671f\u672a\u68c0\u6d4b\u5230\u5fc3\u8df3\uff0c\u90a3\u4e48\u8ba4\u4e3a\u5b9e\u4f8b\u5f02\u5e38\uff1b\u6bd4\u5982Nacos\u5219\u6839\u636e\u5fae\u670d\u52a1\u5b9e\u4f8b\u4e0e\u6ce8\u518c\u4e2d\u5fc3\u7684\u957f\u8fde\u63a5\u72b6\u6001\u5224\u65ad\u5b9e\u4f8b\u662f\u5426\u5f02\u5e38\u3002</li> </ul> <p>\u6b64\u5916\uff0c\u5b9e\u4f8b\u7ba1\u7406\u89c4\u6a21\u3001\u652f\u6301\u5143\u6570\u636e\u7ba1\u7406\u7b49\u4e5f\u662f\u6ce8\u518c\u6ce8\u518c\u4e2d\u5fc3\u6bd4\u8f83\u5e38\u89c1\u7684\u529f\u80fd\u7279\u6027\u3002\u6bd4\u5982Java Chassis 2\u8981\u6c42\u6ce8\u518c\u4e2d\u5fc3\u5fc5\u987b\u652f\u6301\u5951\u7ea6\u7684\u6ce8\u518c\u548c\u7ba1\u7406\u3002</p> <p>Java Chassis 3\u7684\u8bbe\u8ba1\u76ee\u6807\u4e4b\u4e00\uff0c\u5c31\u662f\u964d\u4f4e\u5bf9\u4e8e\u6ce8\u518c\u4e2d\u5fc3\u529f\u80fd\u7684\u4f9d\u8d56\uff0c\u80fd\u591f\u652f\u6301\u5c3d\u53ef\u80fd\u591a\u7684\u6ce8\u518c\u4e2d\u5fc3\uff0c\u800c\u4e0d\u964d\u4f4e\u5fae\u670d\u52a1\u81ea\u8eab\u7684\u53ef\u9760\u6027\u3002 \u5728\u63cf\u8ff0 Java Chassis 3\u7684\u5b9e\u4f8b\u7ba1\u7406\u673a\u5236\u4e4b\u524d\uff0c\u5148\u8ba8\u8bba\u4e00\u4e2a\u5178\u578b\u7684\u95ee\u9898\uff1a\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u3002</p> <p>\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u662f\u6307\u5982\u4e0b\u573a\u666f\uff1a</p> <p></p> <p>\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u4e0e\u6ce8\u518c\u4e2d\u5fc3\u4e4b\u95f4\u7684\u7f51\u7edc\u53d1\u751f\u6545\u969c\uff0c\u800c\u670d\u52a1\u6d88\u8d39\u8005\u4e0e\u6ce8\u518c\u4e2d\u5fc3\u4e4b\u95f4\u7684\u7f51\u7edc\u662f\u6b63\u5e38\u7684\uff0c\u5373\u4ea7\u751f\u5206\u533a\u9694\u79bb\u3002\u5728\u53d1\u751f\u5206\u533a\u9694\u79bb\u7684\u573a\u666f\u4e0b\uff0c\u73b0\u6709\u7684\u4fdd\u6d3b\u673a\u5236\u90fd\u4f1a\u8ba4\u4e3a\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u4e0b\u7ebf\uff0c\u8fdb\u800c\u5bfc\u81f4\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u8bbf\u95ee\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u51fa\u73b0\u5927\u89c4\u6a21\u5931\u8d25\u3002\u5206\u533a\u9694\u79bb\u901a\u5e38\u4f1a\u53d1\u751f\u5728\u6ce8\u518c\u4e2d\u5fc3\u5728\u591aAZ\u90e8\u7f72/\u5bb9\u707e\u7684\u573a\u666f\uff0c\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u548c\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u8fde\u63a5\u7684\u662f\u4e0d\u540cAZ\u7684\u6ce8\u518c\u4e2d\u5fc3\u5b9e\u4f8b\u3002\u5728\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u548c\u6d88\u8d39\u8005\u8de8AZ\u90e8\u7f72\u7684\u65f6\u5019\uff0c\u4e5f\u53ef\u80fd\u53d1\u751f\u3002</p> <p>\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u6545\u969c\u4f1a\u9020\u6210\u5927\u9762\u79ef\u7684\u5e94\u7528\u8c03\u7528\u5931\u8d25\uff0c\u662f\u6ce8\u518c\u4e2d\u5fc3\u6709\u5173\u6545\u969c\u4e2d\uff0c\u6700\u4e25\u91cd\u7684\u6545\u969c\u4e4b\u4e00\u3002</p> <ul> <li>Ribbon\u7684\u89e3\u51b3\u65b9\u6848</li> </ul> <p>Ribbon\u5728\u5ba2\u6237\u7aef\u63d0\u4f9b\u4e86 <code>IPing</code> \u63a5\u53e3\u6765\u68c0\u6d4b\u5b9e\u4f8b\u6545\u969c\uff0c\u4ee5\u68c0\u6d4b\u6ce8\u518c\u4e2d\u5fc3\u9519\u8bef\u4e0b\u7ebf\u5b9e\u4f8b\uff0c\u800c\u5b9e\u4f8b\u5b9e\u9645\u53ef\u4ee5\u5de5\u4f5c\u7684\u573a\u666f\u3002 \u8be5\u673a\u5236\u5728\u591a\u6570\u573a\u666f\u5de5\u4f5c\u826f\u597d\uff0c\u7136\u800c\u5728\u5bb9\u5668\u573a\u666f\u4e0b\uff0c\u53ef\u80fd\u957f\u671f\u4fdd\u7559\u9519\u8bef\u7684\u5b9e\u4f8b\u3002\u56e0\u4e3a\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u4e0d\u662f\u7531\u4e8e\u5206\u533a\u9694\u79bb\u9519\u8bef\uff0c\u800c\u662f\u91cd\u542f\u7684\u573a\u666f\u4e0b\uff0c\u5982\u679c\u539f\u6765\u7684\u7aef\u53e3\u88ab\u5176\u4ed6\u670d\u52a1\u5360\u7528\uff0c\u5219\u4f1a\u5bfc\u81f4\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u59cb\u7ec8\u4fdd\u7559\u9519\u8bef\u7684\u5b9e\u4f8b\u3002</p> <pre><code>public interface IPing {\n boolean isAlive(Server server);\n}\n</code></pre> <ul> <li>Spring Cloud\u7684\u89e3\u51b3\u65b9\u6848</li> </ul> <p>Spring Cloud\u7684\u673a\u5236\u548cRibbon\u7c7b\u4f3c\uff0c\u63d0\u4f9b\u4e86 <code>HealthCheckServiceInstanceListSupplier</code> \uff0c\u5e76\u5141\u8bb8\u5f00\u53d1\u8005\u5b9a\u4e49\u5b9e\u4f8b\u76d1\u63a7\u72b6\u6001\u68c0\u6d4b\u65b9\u5f0f\u3002 </p> <ul> <li>Java Chassis\u7684\u89e3\u51b3\u65b9\u6848</li> </ul> <p>Java Chassis\u7ed3\u5408\u5b9e\u4f8b\u662f\u5426\u5728\u6ce8\u518c\u4e2d\u5fc3\u67e5\u8be2\u5230(History)\u3001\u5b9e\u4f8b\u72b6\u6001(Status)\u3001Ping\u72b6\u6001(Ping)\u3001\u9694\u79bb\u72b6\u6001\uff08Isolation\uff09\u5c06\u5b9e\u4f8b\u5206\u7ec4\uff0c\u5e76\u7ed9\u4e0d\u540c\u7684\u7ec4\u5206\u914d\u4e0d\u540c\u7684\u4f18\u5148\u7ea7\u3002 </p> <p></p> <p>\u5728 <code>Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u8d1f\u8f7d\u5747\u8861\u9009\u62e9\u5668</code> \u4e2d\uff0c\u89e3\u5bc6\u4e86Java Chassis\u5206\u7ec4\u5b9e\u4f8b\u4f7f\u7528\u7684\u673a\u5236\u3002\u5f53\u51fa\u73b0\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u7684\u60c5\u51b5\uff0c\u5b9e\u4f8b\u5728\u6ce8\u518c\u4e2d\u5fc3\u67e5\u8be2\u4e0d\u5230\uff0c\u4ecd\u7136\u88ab\u4fdd\u7559\u5230\u4e86 <code>History</code> \u5206\u7ec4\uff0c\u53ea\u8981\u5b9e\u4f8b Ping \u72b6\u6001\u6b63\u5e38\uff0c \u8fd9\u4e2a\u5b9e\u4f8b\u4ecd\u7136\u4f1a\u88ab\u4f7f\u7528\uff0c \u4ece\u800c\u9632\u6b62\u4e86\u5b9e\u4f8b\u88ab\u9519\u8bef\u4e0b\u7ebf\u3002 </p> <p>Java Chassis\u8fd8\u8bbe\u8ba1\u4e86\u65b0\u7684Ping\u673a\u5236\uff0c\u89e3\u51b3\u5bb9\u5668\u573a\u666f\u4e0b\uff0c\u53ef\u80fd\u957f\u671f\u4fdd\u7559\u9519\u8bef\u7684\u5b9e\u4f8b\u7684\u95ee\u9898\u3002 Ping\u673a\u5236\u7684\u6838\u5fc3\u903b\u8f91\u5305\u542b\u5982\u4e0b\u51e0\u4e2a\u90e8\u5206\uff1a</p> <ul> <li>\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u5411\u6ce8\u518c\u4e2d\u5fc3\u6ce8\u518c\u7684\u65f6\u5019\uff0c\u751f\u6210\u5b9e\u4f8bID\u3002\u5b9e\u4f8bID\u9700\u8981\u4fdd\u8bc1\u8fdb\u7a0b\u7684\u6bcf\u6b21\u91cd\u542f\uff0c\u90fd\u662f\u552f\u4e00\u7684\u3002</li> <li>\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u901a\u8fc7PING\u6d88\u606f\u68c0\u6d4b\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u5b58\u6d3b\u72b6\u6001\u3002PING\u6d88\u606f\u5305\u542b\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u5b9e\u4f8bID\u3002</li> <li>\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u68c0\u6d4bPING\u6d88\u606f\u91cc\u9762\u7684\u5b9e\u4f8bID\uff0c\u5982\u679c\u5b9e\u4f8bID\u4e0e\u81ea\u5df1\u7684\u5b9e\u4f8bID\u76f8\u540c\uff0c\u5219\u8fd4\u56de\u5065\u5eb7\uff0c\u5426\u5219\u8fd4\u56de\u5f02\u5e38\u3002</li> </ul> <p></p> <p>Java Chassis\u63d0\u4f9b\u4e86\u65b0\u7684\u5065\u5eb7\u68c0\u67e5\u63a5\u53e3\uff1a</p> <pre><code>@RestSchema(schemaId = ManagementEndpoint.NAME, schemaInterface = ManagementEndpoint.class)\npublic class ManagementEndpointImpl implements ManagementEndpoint {\n private RegistrationManager registrationManager;\n\n @Autowired\n public void setRegistrationManager(RegistrationManager registrationManager) {\n this.registrationManager = registrationManager;\n }\n\n @Override\n public boolean health(String instanceId, String registryName) {\n String mySelf = registrationManager.getInstanceId(registryName);\n if (StringUtils.isEmpty(mySelf)) {\n return false;\n }\n return mySelf.equals(instanceId);\n }\n}\n</code></pre> <p>Java Chassis 2\u7ed3\u5408Service Center\u7684\u529f\u80fd\u8bbe\u8ba1\uff0c\u5171\u540c\u4fdd\u969c\u4e86\u6ce8\u518c\u53d1\u73b0\u7684\u53ef\u9760\u6027\u3002Java Chassis 3\u901a\u8fc7\u5e94\u7528\u5ba2\u6237\u7aef\u6280\u672f\uff0c\u964d\u4f4e\u4e86\u5bf9\u4e8e\u6ce8\u518c\u4e2d\u5fc3\u7684\u4f9d\u8d56\uff0c\u4f7f\u5f97 Java Chassis 3\u4f7f\u7528\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u90fd\u80fd\u591f\u53d6\u5f97\u5f88\u9ad8\u7684\u53ef\u9760\u6027\u3002 \u5185\u7f6e\u7684\u5b9e\u4f8b\u72b6\u6001\u5206\u7ec4\u7ba1\u7406\u548c\u521b\u65b0\u7684Ping\u673a\u5236\u8bbe\u8ba1\uff0c\u4f7f\u5f97 Java Chassis 3\u5728\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u6545\u969c\u6761\u4ef6\u4e0b\u4e5f\u80fd\u7a33\u5b9a\u7684\u5de5\u4f5c\u3002 </p> <p>\u5ba2\u6237\u6545\u4e8b\uff1a\u6ce8\u518c\u4e2d\u5fc3\u63a8\u7a7a\u6545\u969c\u662f <code>Nacos</code> \u7684\u7ecf\u5178\u6545\u969c\uff0c\u5bf9\u4e8e\u7cfb\u7edf\u53ef\u9760\u6027\u8fd0\u884c\u4ea7\u751f\u4e86\u975e\u5e38\u5927\u7684\u5f71\u54cd\u3002\u63a8\u7a7a\u6545\u969c\u7684\u5f71\u54cd\u673a\u5236\u548c\u5206\u533a\u9694\u79bb\u6545\u969c\u7684\u5f71\u54cd\u673a\u5236\u7c7b\u4f3c\u3002\u501f\u52a9\u4e8eJava Chassis 3\uff0c\u80fd\u591f\u5c06\u4e1a\u52a1\u5f71\u54cd\u7684\u65f6\u95f4\u548c\u8303\u56f4\u964d\u5230\u6700\u4f4e\u3002</p>"},{"location":"featured-topics/secrets/zookeeper.html","title":"Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1aZooKeeper\u6ce8\u518c\u548c\u914d\u7f6e\u4e2d\u5fc3","text":"<p>ZooKeeper \u662f\u4e00\u4e2a\u9ad8\u53ef\u7528\u7684\u5206\u5e03\u5f0f\u534f\u8c03\u7cfb\u7edf\uff0c\u5b83\u4e5f\u88ab\u5e7f\u6cdb\u7528\u4e8e\u670d\u52a1\u6ce8\u518c\u53d1\u73b0\u3001\u670d\u52a1\u914d\u7f6e\u7b49\u573a\u666f\u3002 </p> <p>Java Chassis 3 \u4f7f\u7528 Curator Service Discovery Extensions \u5b9e\u73b0\u6ce8\u518c\u53d1\u73b0\u3002 </p>"},{"location":"featured-topics/secrets/zookeeper.html#_1","title":"\u6ce8\u518c\u548c\u914d\u7f6e\u57fa\u672c\u539f\u7406","text":"<p>\u4f7f\u7528ZooKeeper\u5b9e\u73b0\u6ce8\u518c\u914d\u7f6e\u7684\u539f\u7406\u6bd4\u8f83\u7b80\u5355\uff0c\u53ea\u9700\u8981\u5c06\u5b9e\u4f8b\u4fe1\u606f\u548c\u914d\u7f6e\u4fe1\u606f\u4f5c\u4e3a\u5408\u9002\u7684 key-value \u5bf9\u5199\u5165\u3002\u6ce8\u518c\u573a\u666f\u4f7f\u7528\u4e0b\u9762\u7684\u7ed3\u6784\uff1a</p> <pre><code>servicecomb:\n registry:\n ${environment}\n ${application}:\n ${service}:\n ${instance-id}: \u8be6\u7ec6\u7684\u6ce8\u518c\u5185\u5bb9\n</code></pre> <p>\u914d\u7f6e\u573a\u666f\u4f7f\u7528\u4e0b\u9762\u7684\u7ed3\u6784\uff1a</p> <pre><code>servicecomb:\n config:\n environment: \n ${environment}: \u8be6\u7ec6\u7684\u914d\u7f6e\u5185\u5bb9\n application:\n ${environment}:\n ${application}: \u8be6\u7ec6\u7684\u914d\u7f6e\u5185\u5bb9\n service:\n ${environment}:\n ${application}:\n ${service}: \u8be6\u7ec6\u7684\u914d\u7f6e\u5185\u5bb9\n version:\n ${environment}:\n ${application}:\n ${service}:\n ${version}: \u8be6\u7ec6\u7684\u914d\u7f6e\u5185\u5bb9\n tag:\n ${environment}:\n ${application}:\n ${service}:\n ${tag}: \u8be6\u7ec6\u7684\u914d\u7f6e\u5185\u5bb9\n</code></pre>"},{"location":"featured-topics/secrets/zookeeper.html#_2","title":"\u53ef\u9760\u6027\u8bbe\u8ba1","text":"<p>ZooKeeper\u81ea\u8eab\u88ab\u8bbe\u8ba1\u4e3a\u4e00\u4e2a\u9ad8\u53ef\u9760\u7684\u4e2d\u95f4\u4ef6\uff0cJava Chassis 3\u8fdb\u4e00\u6b65\u589e\u5f3a\u4e86\u5176\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u7684\u53ef\u9760\u6027\uff0c\u5373\u4f7f\u5728ZooKeeper\u81ea\u8eab\u4e0d\u53ef\u7528\u7684\u60c5\u51b5\u4e0b\uff0c\u4ecd\u7136\u4e0d\u5f71\u54cd\u670d\u52a1\u4e4b\u95f4\u7684\u8c03\u7528\uff0c\u8be6\u7ec6\u4e86\u89e3\u8fd9\u4e2a\u673a\u5236\uff0c\u53ef\u4ee5\u53c2\u8003Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u3002 </p> <p>\u4e3a\u4e86\u9a8c\u8bc1\u8fd9\u90e8\u5206\u53ef\u9760\u6027\uff0c\u53ef\u4ee5\u8bbe\u8ba1\u4e00\u4e2a\u7b80\u5355\u7684\u6d4b\u8bd5\u573a\u666f\uff1a</p> <pre><code>\u6d4b\u8bd5\u5de5\u5177 -&gt; edge service -&gt; consumer -&gt; provider\n</code></pre> <p>\u542f\u52a8 edge service\u3001 consumer \u548c provider\uff0c \u901a\u8fc7\u6d4b\u8bd5\u5de5\u5177\u8bf7\u6c42\u63a5\u53e3\u3002 \u7136\u540e\u505c\u6b62 ZooKeeper\uff0c \u5e76\u4f7f\u7528\u6d4b\u8bd5\u5de5\u5177\u6301\u7eed\u8c03\u7528\uff0c\u53ef\u4ee5\u53d1\u73b0\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u6ca1\u6709\u8bf7\u6c42\u5931\u8d25\u3002 \u542f\u52a8 Zookeeper, \u670d\u52a1\u6ce8\u518c\u4fe1\u606f\u6062\u590d\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u4ecd\u7136\u6ca1\u6709\u8bf7\u6c42\u5931\u8d25\u3002 </p> <p>\u5f53\u7136\uff0c\u5728ZooKeeper\u4e0d\u53ef\u7528\u7684\u8fc7\u7a0b\u4e2d\uff0c\u65e0\u6cd5\u6ce8\u518c\u65b0\u7684\u5b9e\u4f8b\u3002</p>"},{"location":"featured-topics/secrets/zookeeper.html#zookeeper","title":"\u5173\u4e8e Zookeeper \u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u7684\u6df1\u5165\u8ba8\u8bba","text":"<p>\u6709\u89c2\u70b9\u8ba4\u4e3a\uff0c ZooKeeper\u4e0d\u9002\u5408\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\uff0c\u4e00\u822c\u7684\uff0cCP\u7cfb\u7edf\u90fd\u4e0d\u9002\u5408\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\uff0c\u800cAP\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u624d\u662f\u6700\u4f73\u9009\u62e9\u3002 \u4e2a\u4eba\u89c9\u5f97\u8fd9\u6837\u7684\u89c2\u70b9\u662f\u7247\u9762\u800c\u4e14\u975e\u5e38\u4e0d\u6070\u5f53\u7684\u3002 </p> <p>\u4eceZooKeeper \u5e76\u4e0d\u9002\u5408\u505a\u6ce8\u518c\u4e2d\u5fc3 \u548c \u4e3a\u4ec0\u4e48\u6211\u4eec\u8981\u628a\u670d\u52a1\u6ce8\u518c\u53d1\u73b0\u6539\u4e3a\u963f\u91cc\u5df4\u5df4\u7684Nacos\u800c\u4e0d\u7528 ZooKeeper\uff1f \u6458\u53d6\u4e86\u51e0\u4e2a\u6838\u5fc3\u89c2\u70b9\uff08\u540e\u9762\u7b80\u79f0\u201c\u89c2\u70b9\u6587\u7ae0\u201d\uff09\uff1a</p> <ul> <li>\u7f51\u7edc\u5206\u533a\u9694\u79bb\u60c5\u51b5\u4e0b\uff0cZooKeeper\u4f1a\u5bfc\u81f4\u670d\u52a1\u95f4\u8c03\u7528\u9519\u8bef\uff0c\u4e5f\u4f1a\u5bfc\u81f4\u65b0\u7684\u670d\u52a1\u65e0\u6cd5\u6ce8\u518c\uff0c\u4e0d\u9002\u5408\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u3002</li> <li>ZooKeeper\u6240\u6709\u5199\u64cd\u4f5c\u90fd\u5728Leader\u8fdb\u884c\uff0c\u65e0\u6cd5\u652f\u6301\u5927\u89c4\u6a21\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u4e0d\u9002\u5408\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u3002</li> </ul> <p>\u4e0b\u9762\u7b80\u5355\u8ba8\u8bba\u4e0b\u8fd9\u4e24\u4e2a\u89c2\u70b9\u3002</p>"},{"location":"featured-topics/secrets/zookeeper.html#_3","title":"\u5173\u4e8e\u7f51\u7edc\u5206\u533a\u9694\u79bb","text":"<p>\u7f51\u7edc\u5206\u533a\u9694\u79bb\u7684\u573a\u666f\u6bd4\u8f83\u591a\uff0c\u5728Java Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u6ce8\u518c\u4e2d\u5fc3\u5206\u533a\u9694\u79bb\u63cf\u8ff0\u7684\u573a\u666f\u4e0b\uff0cJava Chassis\u80fd\u591f\u4fdd\u8bc1\u670d\u52a1\u4e4b\u95f4\u7684\u8c03\u7528\u4e0d\u53d7\u5f71\u54cd\u3002\u5728\u89c2\u70b9\u6587\u7ae0\u63d0\u5230\u7684\u573a\u666f\u4e2d\uff0cJava Chassis\u4e5f\u80fd\u591f\u4fdd\u8bc1\u670d\u52a1\u4e4b\u95f4\u7684\u8c03\u7528\u4e0d\u53d7\u5f71\u54cd\uff0c\u4f46\u662f\u670d\u52a1\u65e0\u6cd5\u6ce8\u518c\u3002\u7f51\u7edc\u5206\u533a\u9694\u79bb\u573a\u666f\u4e0b\uff0c\u6838\u5fc3\u9700\u8981\u8ba8\u8bba\u7684\u95ee\u9898\u53d8\u6210\u662f\u5426\u9700\u8981\u5141\u8bb8\u670d\u52a1\u8fdb\u884c\u6ce8\u518c/\u6269\u5bb9\uff1f\u5c3d\u7ba1\u53ef\u80fd\u5b58\u5728\u4e89\u8bae\uff0c\u4f46\u6211\u4eec\u7684\u89c2\u70b9\u662f\u7cfb\u7edf\u51fa\u73b0\u90e8\u5206\u6545\u969c\u7684\u60c5\u51b5\u4e0b\uff0c\u7cfb\u7edf\u4e0d\u5e94\u8be5\u6269\u5bb9\uff0c\u800c\u662f\u5c3d\u53ef\u80fd\u7ef4\u6301\u5904\u7406\u80fd\u529b\u4e0d\u53d8\uff0c\u8fd9\u6837\u4f1a\u4f7f\u5f97\u6545\u969c\u6062\u590d\u66f4\u52a0\u53ef\u63a7\uff0c\u4ece\u800c\u51cf\u5c11\u7cfb\u7edf\u6062\u590d\u65f6\u95f4\u3002</p> <p>\u89c2\u70b9\u6587\u7ae0\u63d0\u5230\u7684\u573a\u666f\u76f8\u5bf9\u4e8e\u5b9e\u9645\u90e8\u7f72\u573a\u666f\u8fd8\u8fc7\u4e8e\u7b80\u5355\uff0c\u6211\u4eec\u628a\u5b83\u6269\u5c55\u5230\u5b9e\u9645\u573a\u666f\uff1a</p> <p></p> <p>\u5b9e\u9645\u573a\u666f\u9664\u4e86\u4fdd\u969c\u5355AZ\u5185\u7684\u8bf7\u6c42\u95ed\u73af\uff0c\u8fd8\u9700\u8981\u4fdd\u8bc1\u4e0d\u540cAZ\u7684\u5b9e\u4f8b\u80fd\u591f\u5206\u62c5\u6d41\u91cf\u3002\u5f53\u51fa\u73b0AZ\u7f51\u7edc\u9694\u79bb\uff0c\u7531\u4e8e\u6bcf\u4e2aAZ\u5b9e\u4f8b\u611f\u77e5\u5230\u7684\u603b\u7684\u5b9e\u4f8b\u6570\u51cf\u5c11\uff0c\u4f1a\u89e6\u53d1\u5f39\u6027\u6269\u7f29\u5bb9\uff0c\u4ece\u800c\u9700\u8981\u6ce8\u518c\u4e2d\u5fc3\u652f\u6301\u65b0\u5b9e\u4f8b\u6ce8\u518c\u3002 \u4f46\u662f\u672c\u8d28\u4e0a\uff0c\u8fd9\u4e2a\u573a\u666f\u7cfb\u7edf\u7684\u5904\u7406\u80fd\u529b\u5e76\u6ca1\u6709\u964d\u4f4e\uff0c\u5f39\u6027\u6269\u7f29\u5bb9\u5c06\u4f1a\u662f\u4e00\u4e2a\u9519\u8bef\u7684\u884c\u4e3a\uff0c\u8fd9\u4e2a\u9519\u8bef\u7684\u884c\u4e3a\uff0c\u4f1a\u7ed9\u7cfb\u7edf\u8d44\u6e90\u7684\u4f7f\u7528\u548c\u6545\u969c\u6062\u590d\u5e26\u6765\u66f4\u591a\u7684\u4e0d\u53ef\u9884\u6d4b\u56e0\u7d20\u3002</p>"},{"location":"featured-topics/secrets/zookeeper.html#_4","title":"\u5173\u4e8e\u6027\u80fd","text":"<p>ZooKeeper\u53ea\u6709Leader\u53ef\u4ee5\u5199\u5165\uff0c\u901a\u8fc7\u6269\u5bb9Learner(Follower/Observer)\u63d0\u5347\u8bfb\u53d6\u6027\u80fd\u3002\u6ce8\u518c\u914d\u7f6e\u4e2d\u5fc3\u7684\u573a\u666f\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u8bfb\u8981\u6c42\u9ad8\uff0c\u5199\u8981\u6c42\u4e0d\u9ad8\u7684\u573a\u666f, ZooKeeper\u5f88\u597d\u7684\u6ee1\u8db3\u4e86\u5199\u4e0d\u9891\u7e41\uff0c\u8bfb\u5f88\u9891\u7e41\u7684\u8981\u6c42\u3002 \u6700\u590d\u6742\u7684\u4e1a\u52a1\u7cfb\u7edf\uff0cZooKeeper\u7ba1\u7406\u7684\u5b9e\u4f8b\u4e2a\u6570\u572810000\u4ee5\u4e0b\uff0c\u5373\u4f7f\u8fd9\u4e9b\u7cfb\u7edf\u88ab\u8bbe\u8ba1\u4e3a\u5141\u8bb8\u52a8\u6001\u5f39\u6027\u6269\u7f29\u5bb9\u3002\u8d85\u5927\u89c4\u6a21\u7684\u4e1a\u52a1\u7cfb\u7edf\uff0c\u4e00\u822c\u5fae\u670d\u52a1\u7f51\u5173\u6765\u63d0\u5347\u7cfb\u7edf\u97e7\u6027\uff0c\u5e76\u9632\u6b62\u672a\u77e5\u6545\u969c\u5e26\u6765\u7684\u7206\u70b8\u534a\u5f84\u6269\u5927\u3002 \u5728\u524d\u671fJava Chassis 3\u6280\u672f\u89e3\u5bc6\uff1a\u4e0eSpring Cloud\u7684\u4e92\u64cd\u4f5c\u5206\u4eab\u4e86\u67b6\u6784\u97e7\u6027\u7684\u4e00\u4e9b\u5185\u5bb9\u3002</p> <p></p> <p>\u56e0\u6b64\uff0c\u652f\u6301\u8d85\u5927\u89c4\u6a21\u670d\u52a1\u6ce8\u518c\u7684\u573a\u666f\uff0c\u4e0d\u5177\u5907\u5927\u7684\u73b0\u5b9e\u610f\u4e49\u3002 \u5173\u4e8e\u8d85\u5927\u89c4\u6a21\u5b9e\u4f8b\u7ba1\u7406\u7684\u95ee\u9898\uff0c\u53ef\u80fd\u66f4\u591a\u6765\u81ea\u4e8e\u4e0d\u6070\u5f53\u7684\u67b6\u6784\u8bbe\u8ba1\u6216\u8005\u5fae\u670d\u52a1\u53d1\u73b0\u673a\u5236\uff08\u6bd4\u5982\u65e9\u671fDubbo\u7248\u672c\u4f7f\u7528\u7684\u57fa\u4e8e\u63a5\u53e3\u7684\u670d\u52a1\u53d1\u73b0\uff0c\u5b9e\u4f8b\u4e2a\u6570\u548c\u63a5\u53e3\u6570\u91cf\u6210\u6b63\u6bd4\uff09\u3002</p>"},{"location":"featured-topics/secrets/zookeeper.html#_5","title":"\u603b\u7ed3","text":"<p>Java Chassis 3\u4f7f\u7528ZooKeeper\u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u662f\u975e\u5e38\u597d\u7684\u9009\u62e9\uff0cZooKeeper\u53ef\u4ee5\u5728\u5e94\u7528\u7cfb\u7edf\u4e2d\u540c\u65f6\u626e\u6f14\u6ce8\u518c\u3001\u914d\u7f6e\u548c\u9009\u4e3e\u7b49\u529f\u80fd\uff0c\u80fd\u591f\u6781\u5927\u7684\u7b80\u5316\u5e94\u7528\u90e8\u7f72\u548c\u670d\u52a1\u4f9d\u8d56\u3002CP\u4e00\u81f4\u6027\u4e5f\u4f7f\u5f97\u5e38\u89c1\u6545\u969c\u573a\u666f\u4e0b\u5e94\u7528\u7a0b\u5e8f\u7684\u884c\u4e3a\u5177\u5907\u66f4\u597d\u7684\u9884\u6d4b\u6027\u3002\u5927\u89c4\u6a21\u7cfb\u7edf\u53ef\u4ee5\u91c7\u7528\u5fae\u670d\u52a1\u7f51\u5173\u6765\u63d0\u5347\u7cfb\u7edf\u97e7\u6027\uff0c\u964d\u4f4e\u7cfb\u7edf\u7206\u70b8\u534a\u5f84\u3002</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html","title":"2.8.x \u5347\u7ea7 3.0.0 \u6307\u5bfc","text":"<p>3.0.0\u7248\u672c\u7684\u91cd\u8981\u66f4\u65b0\uff1a</p> <ul> <li>\u6700\u5c0f\u652f\u6301 JDK 17</li> <li>\u91c7\u7528Spring Boot 3\u4f5c\u4e3a\u5f00\u53d1\u5e95\u5ea7\uff0c\u5e95\u5c42\u5b9e\u73b0\u4f9d\u8d56Spring Boot 3\uff0c\u4e0d\u518d\u63d0\u4f9bSpring\u542f\u52a8\u65b9\u5f0f\u3002</li> <li>\u652f\u6301 OpenAPI 3.0 \u89c4\u8303</li> </ul> <p>\u672c\u6587\u6863\u63d0\u4f9b2.8.x\u5347\u7ea7\u52303.0.0\u7684\u6307\u5bfc\u3002</p> <p>\u8bf4\u660e\uff1a\u7531\u4e8eSpring Boot 3\u4e0d\u518d\u517c\u5bb9 javax.servlet\uff0c javax.ws \u7b49\u7ec4\u4ef6\uff0c\u5e76\u4e14 swagger 1.x \u6ca1\u6709\u63d0\u4f9b jakarta.servlet\u652f\u6301\uff0c3.0.0 \u7248\u672c\u4f7f\u7528 swagger 2.x \u652f\u6301 Open API 3.0\u3002 \u56e0\u6b64\uff0c3.0.0 \u7248\u672c\u4e0d\u80fd\u4fdd\u8bc1\u4e0e 2.x.x \u7248\u672c\u4e4b\u95f4\u7684\u6b63\u5e38\u901a\u4fe1\u3002 \u5728\u5347\u7ea7 3.0.0 \u7684\u65f6\u5019\uff0c\u9700\u8981\u6ce8\u610f\u5bf9\u73b0\u6709\u670d\u52a1\u8fdb\u884c\u5168\u91cf\u5347\u7ea7\uff0c\u4e0d\u652f\u6301\u72ec\u7acb\u5347\u7ea7\u5ba2\u6237\u7aef\u6216\u8005\u670d\u52a1\u7aef\u5fae\u670d\u52a1\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#_1","title":"\u4f9d\u8d56\u914d\u7f6e\u548c\u542f\u52a8\u7c7b","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#java-chassistransport","title":"Java Chassis\u539f\u751fTransport","text":"<p>Java Chassis\u539f\u751f\u63d0\u4f9b\u4e86 Rest Over Vert.x, Highway\u7b49\u539f\u751fTransport\u3002Edge Service\u4e5f\u4f7f\u7528\u539f\u751fTransport\u8fd0\u884c\u3002</p> <p>TODO</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#spring-boot-servlet-transport","title":"Spring Boot Servlet Transport","text":"<p>Java Chassis\u652f\u6301\u8fd0\u884c\u4e0eServlet\u5bb9\u5668\uff0c\u81ea\u8eab\u4f5c\u4e3a\u4e00\u4e2aServlet\u542f\u52a8\u3002</p> <p>TODO</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#web-servlet-transport","title":"\u72ec\u7acbWEB\u5bb9\u5668 Servlet Transport","text":"<p>Java Chassis\u652f\u6301\u8fd0\u884c\u4e0eServlet\u5bb9\u5668\uff0c\u81ea\u8eab\u4f5c\u4e3a\u4e00\u4e2aServlet\u542f\u52a8\u3002</p> <p>TODO</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#spi-bean","title":"SPI \u4fee\u6539\u4e3a Bean","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#bootlistener","title":"BootListener","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#metricsinitializer","title":"MetricsInitializer","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#discoveryfilter","title":"DiscoveryFilter","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#cse","title":"\u914d\u7f6e\u9879\u4e0d\u518d\u652f\u6301 <code>cse</code> \u524d\u7f00","text":"<p>Java Chassis \u7684\u6240\u6709\u914d\u7f6e\u9879\u5168\u90e8\u4f7f\u7528 <code>servicecomb</code> \u4f5c\u4e3a\u524d\u7f00\uff0c\u6bd4\u5982\uff1a</p> <pre><code>servicecomb:\n service:\n application: my-application\n name: my-service\n</code></pre> <p>\u65e9\u671f\u7248\u672c\uff0c\u4e5f\u652f\u6301\u4e0b\u9762\u7684\u914d\u7f6e\uff1a</p> <pre><code>cse:\n service:\n application: my-application\n name: my-service\n</code></pre> <p>3.0.0 \u7248\u672c\u4e0d\u518d\u63d0\u4f9b <code>cse</code> \u524d\u7f00\u652f\u6301\uff0c\u9700\u8981\u5c06 <code>cse</code> \u524d\u7f00\u4fee\u6539\u4e3a <code>servicecomb</code>\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#_2","title":"\u7248\u672c\u7ba1\u7406","text":"<p>3.0.0 \u7b80\u5316\u4e86\u6ce8\u518c\u53d1\u73b0\u7684\u4f9d\u8d56\u548c\u5b9e\u73b0\uff0c\u4ee5\u652f\u6301\u66f4\u591a\u7684\u6ce8\u518c\u4e2d\u5fc3\u5b9e\u73b0\u3002 3.0.0 \u4e0d\u518d\u652f\u6301\u7248\u672c\u7684\u7ba1\u7406\u3002\u5177\u4f53\u8868\u73b0\u4e3a\u51e0\u4e2a\u5e38\u7528\u7684\u573a\u666f\uff1a</p> <ul> <li>\u5ba2\u6237\u7aef\u6307\u5b9a version-rule\uff0c\u6307\u660e\u53ea\u8c03\u7528\u670d\u52a1\u7aef\u7684\u67d0\u4e9b\u7248\u672c\uff1b</li> <li>\u5ba2\u6237\u7aef\u6839\u636e\u6bcf\u4e2a\u7248\u672c\u7684 Open API \u5b9a\u4e49\uff0c\u80fd\u591f\u533a\u5206\u67d0\u4e2a operation \u662f\u5426\u5b58\u5728\u4e8e\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u907f\u514d\u5c06\u8bf7\u6c42\u53d1\u9001\u5230\u4e0d\u5b58\u5728\u8be5 operation \u7684\u5b9e\u4f8b\u3002</li> <li>Edge Service\u4e0d\u518d\u652f\u6301\u7248\u672c\u914d\u7f6e\u3002 \u5373\u53ea\u80fd\u914d\u7f6e /microservice/path\uff0c \u4e0d\u80fd\u914d\u7f6e /microservice/version-rule/path\u3002 \u7c7b\u4f3c\u7684\u573a\u666f\u53ef\u4ee5\u91c7\u7528\u7070\u5ea6\u53d1\u5e03\u6765\u89e3\u51b3\u3002</li> </ul>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#_3","title":"\u5951\u7ea6\u52a0\u8f7d\u6d41\u7a0b\u53d8\u5316","text":"<ul> <li> <p>\u4f5c\u4e3a\u63d0\u4f9b\u8005\u7684\u5951\u7ea6\u52a0\u8f7d</p> <p>3.0.0\u7248\u672c\u63d0\u4f9b\u8005\u4e0d\u518d\u52a0\u8f7d\u672c\u5730\u5951\u7ea6\uff0c\u800c\u662f\u6839\u636e\u4ee3\u7801\u751f\u6210\u5951\u7ea6\uff0c\u5e76\u5c06\u751f\u6210\u7684\u5951\u7ea6\u6ce8\u518c\u5230\u6ce8\u518c\u4e2d\u5fc3\u3002\u505a\u8fd9\u4e2a\u53d8\u5316\u7684\u76ee\u7684\uff0c\u4e3b\u8981\u662f\u56e0\u4e3a\u624b\u5199\u5951\u7ea6\u548c\u4ee3\u7801\u672c\u8eab\u751f\u6210\u5951\u7ea6\u4e0d\u4e00\u81f4\u7684\u60c5\u51b5\uff0c\u4f1a\u5bfc\u81f4\u4ee3\u7801\u8bed\u4e49\u9605\u8bfb\u56f0\u96be\uff0c\u5e26\u6765\u5f88\u591a\u9690\u85cf\u4e0d\u6613\u53d1\u73b0\u7684\u9519\u8bef\u3002\u800c\u8bed\u4e49\u4e00\u81f4\u7684\u60c5\u51b5\uff0c\u8fd9\u79cd\u4f7f\u7528\u65b9\u5f0f\u6ca1\u6709\u5b9e\u9645\u610f\u4e49\uff0c\u4f7f\u7528\u4ee3\u7801\u751f\u6210\u5951\u7ea6\u5f97\u5230\u4e00\u6837\u7684\u7ed3\u679c\u3002</p> </li> <li> <p>\u4f5c\u4e3a\u6d88\u8d39\u8005\u7684\u5951\u7ea6\u52a0\u8f7d</p> <p>3.0.0\u7248\u672c\u6d88\u8d39\u8005\u5951\u7ea6\u52a0\u8f7d\u6d41\u7a0b\u4e0d\u53d8\u3002\u4f18\u5148\u52a0\u8f7d\u672c\u5730\u5951\u7ea6\u3002</p> </li> </ul>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#1x","title":"1.x \u517c\u5bb9\u6027\u5220\u9664","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#_4","title":"\u53c2\u6570\u4f4d\u7f6e\u5339\u914d","text":"<p>1.x \u548c 2.x \u7248\u672c\uff0c Java\u4ee3\u7801\u751f\u6210\u5951\u7ea6\u540e\uff0c\u5951\u7ea6\u7684\u53c2\u6570\u4e2a\u6570\u548c\u987a\u5e8f\u53ef\u4ee5\u4fdd\u6301Java\u4ee3\u7801\u7684Method\u4e00\u81f4\u3002Java Chassis 2.x \u57fa\u4e8e\u5951\u7ea6\uff0c\u9ed8\u8ba4\u6839\u636e\u53c2\u6570\u540d\u79f0\u4ece\u5951\u7ea6\u4e2d\u67e5\u627e\u662f\u5426\u5b58\u5728\u8be5\u53c2\u6570\u3002 \u4f46\u662f1.x\u7248\u672c\uff0c\u4e0d\u662f\u57fa\u4e8e\u540d\u79f0\u67e5\u627e\u7684\uff0c\u800c\u662f\u57fa\u4e8e\u53c2\u6570\u4f4d\u7f6e\u67e5\u627e\u7684\u3002 \u6240\u4ee5\u5728\u90e8\u5206\u53c2\u6570\u540d\u79f0\u4e0d\u5339\u914d\u7684\u60c5\u51b5\u4e0b\uff0c2.x\u505a\u4e86\u4e00\u4e9b\u517c\u5bb9\u6027\u5904\u7406\uff0c\u5229\u7528\u4e86Open API 2.0\u53ef\u4ee5\u4fdd\u8bc1\uff08\u6700\u5927\u9650\u5ea6\uff0c\u975e\u786e\u5b9a\u6027\u7b97\u6cd5\uff09\u987a\u5e8f\u7684\u673a\u5236\uff0c\u53ef\u4ee5\u901a\u8fc7\u4f4d\u7f6e\u5339\u914d\u5230\u53c2\u6570\u3002Open API 3.0.0\u7684\u53c2\u6570\u57fa\u4e8e\u540d\u79f0\uff0c\u5e76\u4e14\u4e0d\u5728\u4fdd\u8bc1\u548cJava\u7684Method\u53c2\u6570\u4f4d\u7f6e\u4e00\u81f4\uff0c\u56e0\u6b643.0.0\u7248\u672c\u4e0d\u5728\u652f\u6301\u8fd9\u4e2a\u53c2\u6570\u4f4d\u7f6e\u5339\u914d\u7684\u67e5\u627e\u573a\u666f\u3002 \u5728\u5b9a\u4e49\u53c2\u6570\u7684\u65f6\u5019\uff0c\u9700\u8981\u4fdd\u8bc1Java\u7684Method\u53c2\u6570\u540d\u79f0\uff08\u6216\u8005\u901a\u8fc7annotation\u58f0\u660e\u7684\u53c2\u6570\u540d\u79f0\uff09\u4e0e\u5951\u7ea6\u7684\u540d\u79f0\u4e00\u81f4\u3002\uff08Parameter\u4f7f\u7528name\u5c5e\u6027\uff1bRequestBody\u4f7f\u7528\u6269\u5c55\u5c5e\u6027x-name\uff0c\u5982\u679c\u662fform\u683c\u5f0f\uff0c\u5219\u4f7f\u7528Property\u7684key\u4f5c\u4e3a\u540d\u79f0\u3002\uff09</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#rest-open-api","title":"REST \u548c Open API\u5e38\u89c1\u4e0d\u517c\u5bb9\u95ee\u9898","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#collectionformat","title":"collectionFormat","text":"<p>collectionFormat \u5728 2.0 \u7528\u6765\u8868\u793a Query \u53c2\u6570\u7684\u5f62\u5f0f\u3002 \u5728 3.0 \u540e\uff0c \u4e0d\u518d\u652f\u6301 tsv \u548c jason \u683c\u5f0f\u3002 \u800c\u662f\u6307\u5b9a style \u548c explode\u3002 \u8be6\u7ec6\u53c2\u8003\uff1a https://swagger.io/docs/specification/serialization/</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#springmvc","title":"SpringMVC\u3000\u53d8\u66f4\u9879","text":""},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#requestattribute-requestparam","title":"@RequestAttribute \u548c @RequestParam \u6807\u7b7e","text":"<p>\u5728 servicecomb \u7684\u5f00\u53d1\u6307\u5357\u91cc\u9762\uff0c @RequestAttribute \u6807\u7b7e\u63cf\u8ff0\u4e3a\u4e0d\u652f\u6301\u3002 \u4f46\u662f\u5b9e\u9645\u7528\u6237\u4f7f\u7528\u5e76\u4e0d\u4f1a\u62a5\u9519\uff0c\u800c\u4e14\u5c06\u8fd9\u4e2a\u6620\u5c04\u4e3aHTTP\u7684form\u53c2\u6570\u3002 3.0.0 \u91c7\u7528 @RequestAttribute \u8868\u793a form \u53c2\u6570\uff0c @RequestParam \u8868\u793a query\u53c2\u6570\u3002</p> <p>\u5728\u4f7f\u7528\u4e0a\u9700\u8981\u6ce8\u610f\u4e0espring web\u539f\u751f\u884c\u4e3a\u7684\u5dee\u5f02\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#asyncresttemplate","title":"\u4e0d\u5728\u652f\u6301 AsyncRestTemplate","text":"<p>Spring 6 \u5220\u9664\u4e86 AsyncRestTemplate \u652f\u6301\uff0c Java Chassis 3.0.0 \u4e5f\u5220\u9664\u4e86\u652f\u6301\u3002 \u76f8\u5173\u4ee3\u7801\u9700\u8981\u4f7f\u7528 <code>CompletableFuture</code> \u5f02\u6b65\u4ee3\u7801\u66ff\u6362\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#log4j-logback","title":"\u79fb\u9664 log4j , logback \u7684\u5c01\u88c5","text":"<p>Java Chassis \u7cfb\u7edf\u5185\u90e8\u5168\u90e8\u91c7\u7528 <code>slf4j</code> \u8bb0\u5f55\u65e5\u5fd7\uff0c \u4e0d\u518d\u63d0\u4f9b log4j \u7684\u5c01\u88c5\u529f\u80fd\uff0c \u5220\u9664\u4e86 Log4jUtils \u7b49\u7c7b\u3002 \u5982\u679c\u4f7f\u7528\u4e86 Log4jUtils \u7c7b\u6765\u521d\u59cb\u5316\u65e5\u5fd7\uff0c \u53ef\u4ee5\u53c2\u8003 \u914d\u7f6e\u65e5\u5fd7 \u6765\u8bbe\u7f6e\u7cfb\u7edf\u65e5\u5fd7\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#bizkeeper","title":"\u79fb\u9664 bizkeeper \u5904\u7406\u94fe","text":"<p>Java Chassis \u65e9\u671f\u7248\u672c\u57fa\u4e8e <code>Hystrix</code> \u63d0\u4f9b\u4e86\u57fa\u4e8e\u65b9\u6cd5\u7684\u670d\u52a1\u6cbb\u7406\u80fd\u529b\uff0c\u7531\u4e8e\u793e\u533a\u5df2\u7ecf\u505c\u6b62 <code>Hystrix</code> \u7ef4\u62a4\uff0c\u5e76\u4e14 <code>bizkeeper</code> \u8bbe\u8ba1\u4e0a\u4e0d\u80fd\u5f88\u597d\u7684\u6ee1\u8db3\u573a\u666f\u7684\u6545\u969c\u6a21\u5f0f\u4fdd\u62a4\uff0c 3.0.0 \u7248\u672c\u5220\u9664\u4e86\u8fd9\u4e2a\u6a21\u5757\u3002 \u670d\u52a1\u6cbb\u7406\u53ef\u4ee5\u4f7f\u7528\u6d41\u91cf\u7279\u5f81\u6cbb\u7406\u6765\u5b9e\u73b0\uff0c\u8fc7\u8f7d\u4fdd\u62a4\u7684\u6700\u4f73\u5904\u7406\u65b9\u6848\u662f\u914d\u7f6e\u5ba2\u6237\u7aef\u9694\u79bb\u4ed3\u3002</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#_5","title":"\u79fb\u9664\u5b9e\u4f8b\u9694\u79bb\u529f\u80fd","text":"<p>Java Chassis 3.0.0 \u4e0d\u518d\u652f\u6301\u4e0b\u9762\u7684\u914d\u7f6e\u9879\uff1a</p> <pre><code>servicecomb:\n loadbalance:\n isolation:\n enabled: false\n errorThresholdPercentage: 0\n enableRequestThreshold: 5\n singleTestTime: 60000\n continuousFailureThreshold: 5\n maxSingleTestWindow: 60000 # \u4e3a\u4e86\u4fdd\u8bc1\u5728\u5e76\u53d1\u60c5\u51b5\u4e0b\u53ea\u6709\u4e00\u4e2a\u5b9e\u4f8b\u653e\u901a\uff0c\u4f1a\u9501\u5b9a\u653e\u901a\u5b9e\u4f8b\u3002\u8fd9\u4e2a\u65f6\u95f4\u8868\u793a\u6700\u5927\u9501\u5b9a\u65f6\u95f4\u3002\n minIsolationTime: 3000 # \u6700\u77ed\u9694\u79bb\u65f6\u95f4\u3002\u5e76\u53d1\u60c5\u51b5\u4e0b\uff0c\u5b9e\u4f8b\u9694\u79bb\u540e\u8fdb\u884c\u4e2d\u7684\u8bf7\u6c42\u53ef\u80fd\u5feb\u901f\u5237\u65b0\u9694\u79bb\u72b6\u6001\uff0c\u589e\u52a0\u6700\u77ed\u9694\u79bb\u65f6\u95f4\u3002\n recoverImmediatelyWhenSuccess: true # \u653e\u901a\u5b9e\u4f8b\uff0c\u5982\u679c\u8c03\u7528\u6210\u529f\uff0c\u7acb\u5373\u6e05\u9664\u7edf\u8ba1\u72b6\u6001\uff0c\u4fdd\u8bc1\u540e\u7eed\u8bf7\u6c42\u80fd\u591f\u4f7f\u7528\u8be5\u5b9e\u4f8b\u3002 2.1.3 \u65b0\u589e\u3002\n</code></pre> <p>\u5355\u5b9e\u4f8b\u6545\u969c\u9632\u62a4\u53ef\u4ee5\u4f7f\u7528\u6d41\u91cf\u7279\u5f81\u6cbb\u7406\u6765\u5b9e\u73b0\uff0c\u542f\u7528\u5ba2\u6237\u7aef\u7194\u65ad\u548c\u5ba2\u6237\u7aef\u9694\u79bb\u4ed3\u3002</p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#archaius","title":"\u79fb\u9664 archaius","text":"<p>Java Chassis \u65e9\u671f\u7248\u672c\u57fa\u4e8earchaius\u5b9e\u73b0\u52a8\u6001\u914d\u7f6e\uff0c \u7531\u4e8e\u8fd9\u4e2a\u8f6f\u4ef6\u5df2\u7ecf\u505c\u6b62\u7ef4\u62a4\uff0c 3.0.0\u79fb\u9664\u4e86\u8fd9\u4e2a\u4f9d\u8d56\uff0c\u5b8c\u6210\u96c6\u6210\u548c\u4f7f\u7528 Spring Boot\u914d\u7f6e\u673a\u5236\u3002 \u610f\u5473\u7740\u4e1a\u52a1 \u4f7f\u7528 DynamicPropertyFactory \u7b49 archaius API\u8bfb\u53d6\u914d\u7f6e\u7684\u5730\u65b9\uff0c\u9700\u8981\u4f7f\u7528 Spring Boot \u7684 Environment API\u3002 Java Chassis\u4ecd\u7136\u4fdd\u7559\u4e86 DynamicProperties \u63a5\u53e3\uff0c @InjectProperty\u7684\u914d\u7f6e\u4f7f\u7528\u65b9\u5f0f\uff0c \u80fd\u591f\u66f4\u52a0\u65b9\u4fbf\u7684\u4f7f\u7528\u52a8\u6001\u914d\u7f6e\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#_6","title":"\u591a\u79cd\u5e8f\u5217\u5316\u652f\u6301","text":"<p>3.0.0\u7248\u672c\u652f\u6301REST\u98ce\u683c\u591a\u79cd\u5e8f\u5217\u5316\u652f\u6301\uff0c\u5728application/json\u57fa\u7840\u4e4b\u4e0a\uff0c\u652f\u6301text/plain, application/protobuf\u652f\u6301\u3002 </p>"},{"location":"featured-topics/upgrading/2_8_0T3_0_0.html#archetypes","title":"\u63d0\u4f9b\u65b0\u7684 archetypes \u63d2\u4ef6","text":"<p>TODO</p>"},{"location":"general-development/AlarmEvent.html","title":"\u76d1\u542c\u544a\u8b66\u4e8b\u4ef6","text":""},{"location":"general-development/AlarmEvent.html#_2","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>Java-Chassis \u4f1a\u5728\u8fd0\u884c\u671f\u95f4\u629b\u51fa\u4e00\u4e9b\u4e0e\u5fae\u670d\u52a1\u6cbb\u7406\u76f8\u5173\u7684\u544a\u8b66\u4e8b\u4ef6\uff0c\u5f53\u524d\u6d89\u53ca\u7684\u573a\u666f\u5305\u62ec\uff1a</p> <ul> <li>\u670d\u52a1\u7194\u65ad</li> <li>\u5b9e\u4f8b\u9694\u79bb</li> </ul> <p>\u7528\u6237\u53ef\u4ee5\u81ea\u884c\u6269\u5c55\u544a\u8b66\u4e8b\u4ef6\u76d1\u542c\u5668\uff0c\u83b7\u53d6\u76f8\u5173\u4e8b\u4ef6\u3002</p>"},{"location":"general-development/AlarmEvent.html#_3","title":"\u544a\u8b66\u4e8b\u4ef6\u5217\u8868","text":"\u4e8b\u4ef6 \u4e8b\u4ef6\u5c5e\u6027 \u5c5e\u6027\u8bf4\u660e CircutBreakerEvent\u670d\u52a1\u7194\u65ad\u4e8b\u4ef6 type \u4e8b\u4ef6\u7c7b\u578b\uff0c\u5305\u542b`OPEN`/`CLOSE`\u4e24\u4e2a\u679a\u4e3e\u503c\uff0c\u5206\u522b\u8868\u793a\u4e8b\u4ef6\u53d1\u751f\u548c\u4e8b\u4ef6\u6062\u590d role \u7194\u65ad\u4e8b\u4ef6\u53d1\u751f\u65f6\u672c\u670d\u52a1\u5b9e\u4f8b\u7684\u89d2\u8272\uff0c\u6709`CONSUMER`/`PRODUCER`\u4e24\u79cd\u53d6\u503c microservice \u88ab\u7194\u65ad\u7684\u670d\u52a1\u540d schema \u88ab\u7194\u65ad\u7684\u670d\u52a1\u7684\u5951\u7ea6ID operation \u88ab\u7194\u65ad\u7684\u670d\u52a1\u7684\u65b9\u6cd5\u540d currentTotalRequest \u5f53\u524d\u603b\u8bf7\u6c42\u6570 currentErrorCount \u5f53\u524d\u8bf7\u6c42\u51fa\u9519\u8ba1\u6570 currentErrorPercentage \u5f53\u524d\u8bf7\u6c42\u51fa\u9519\u767e\u5206\u6bd4 requestVolumeThreshold 10s\u5185\u8bf7\u6c42\u6570\u9700\u8981\u5927\u4e8e\u7b49\u4e8e\u8fd9\u4e2a\u53c2\u6570\u503c\uff0c\u624d\u5f00\u59cb\u8ba1\u7b97\u9519\u8bef\u7387\u548c\u5224\u65ad\u662f\u5426\u8fdb\u884c\u7194\u65ad sleepWindowInMilliseconds \u7194\u65ad\u6548\u679c\u7ef4\u6301\u65f6\u95f4 errorThresholdPercentage \u9519\u8bef\u7387\u9608\u503c\uff0c\u8fbe\u5230\u6b64\u9608\u503c\u5219\u89e6\u53d1\u7194\u65ad IsolationServerEvent\u5b9e\u4f8b\u9694\u79bb\u4e8b\u4ef6 type \u4e8b\u4ef6\u7c7b\u578b\uff0c\u5305\u542b`OPEN`/`CLOSE`\u4e24\u4e2a\u679a\u4e3e\u503c\uff0c\u5206\u522b\u8868\u793a\u4e8b\u4ef6\u53d1\u751f\u548c\u4e8b\u4ef6\u6062\u590d microserviceName \u88ab\u9694\u79bb\u5b9e\u4f8b\u7684\u5fae\u670d\u52a1\u540d endpoint \u88ab\u9694\u79bb\u5b9e\u4f8b\u7684endpoint\u4fe1\u606f instance \u88ab\u9694\u79bb\u5b9e\u4f8b\u7684\u5b9e\u4f8b\u4fe1\u606f\uff0c\u7c7b\u578b\u4e3a<code>org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance</code> currentTotalRequest \u5f53\u524d\u5b9e\u4f8b\u603b\u8bf7\u6c42\u6570 currentCountinuousFailureCount \u5f53\u524d\u5b9e\u4f8b\u8fde\u7eed\u51fa\u9519\u6b21\u6570 currentErrorPercentage \u5f53\u524d\u5b9e\u4f8b\u51fa\u9519\u767e\u5206\u6bd4 minIsolationTime \u5b9e\u4f8b\u9694\u79bb\u6548\u679c\u7ef4\u6301\u7684\u6700\u77ed\u4e8b\u4ef6\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2 enableRequestThreshold \u5f00\u542f\u5b9e\u4f8b\u9694\u79bb\u72b6\u6001\u7edf\u8ba1\u7684\u9608\u503c\uff0c\u603b\u8bf7\u6c42\u6b21\u6570\u8d85\u8fc7\u6b64\u9608\u503c\u65f6\u5f00\u59cb\u8ba1\u7b97\u8bf7\u6c42\u5931\u8d25\u60c5\u51b5\uff0c\u5224\u65ad\u662f\u5426\u9694\u79bb\u5b9e\u4f8b continuousFailureThreshold \u8fde\u7eed\u8bf7\u6c42\u5931\u8d25\u9608\u503c\uff0c\u5728\u8fde\u7eed\u8bf7\u6c42\u5931\u8d25\u6b21\u6570\u89e6\u53d1\u9694\u79bb\u7684\u6a21\u5f0f\u4e0b\uff0c\u5982\u679c\u4e00\u4e2a\u5b9e\u4f8b\u8fde\u7eed\u8c03\u7528\u5931\u8d25\u6b21\u6570\u8d85\u8fc7\u6b64\u9608\u503c\u5219\u88ab\u9694\u79bb errorThresholdPercentage \u8bf7\u6c42\u9519\u8bef\u7387\u9608\u503c\uff0c\u5728\u8bf7\u6c42\u9519\u8bef\u7387\u89e6\u53d1\u9694\u79bb\u7684\u6a21\u5f0f\u4e0b\uff0c\u5982\u679c\u4e00\u4e2a\u5b9e\u4f8b\u7684\u8bf7\u6c42\u5931\u8d25\u7387\u8d85\u8fc7\u6b64\u9608\u503c\u5219\u88ab\u9694\u79bb singleTestTime \u5b9e\u4f8b\u9694\u79bb\u6548\u679c\u7ef4\u6301\u65f6\u95f4"},{"location":"general-development/AlarmEvent.html#_4","title":"\u4f7f\u7528\u53c2\u8003","text":"<ul> <li>\u5b9a\u4e49\u544a\u8b66\u4e8b\u4ef6\u76d1\u542c\u5668</li> </ul> <pre><code>public class AlarmListener {\n @Subscribe\n public void onAllKindsOfEvent(AlarmEvent event) {\n // \u76d1\u542c\u544a\u8b66\u4e8b\u4ef6\u7684\u57fa\u7c7b\u4ee5\u83b7\u53d6\u6240\u6709\u79cd\u7c7b\u7684\u544a\u8b66\u4e8b\u4ef6\n }\n\n @Subscribe\n public void onCircutBreakerEvent(CircutBreakerEvent event) {\n // \u4ec5\u76d1\u542c\u670d\u52a1\u7194\u65ad\u4e8b\u4ef6\n }\n\n @Subscribe\n public void onIsolationServerEvent(IsolationServerEvent event) {\n // \u4ec5\u76d1\u542c\u5b9e\u4f8b\u9694\u79bb\u4e8b\u4ef6\n }\n}\n</code></pre> <p>\u4e8b\u4ef6\u76d1\u542c\u5668\u793a\u4f8b\u5982\u4e0a\u6240\u793a\uff0c\u76d1\u542c\u5668\u91cc\u7684\u4e09\u4e2a\u65b9\u6cd5\u5206\u522b\u7528\u4e8e\u76d1\u542c\u5168\u90e8\u544a\u8b66\u4e8b\u4ef6\u3001\u4ec5\u76d1\u542c\u670d\u52a1\u7194\u65ad\u4e8b\u4ef6\u3001\u4ec5\u76d1\u542c\u5b9e\u4f8b\u9694\u79bb\u4e8b\u4ef6\u3002 \u6ce8\u610f\uff0c\u76d1\u542c\u5668\u91cc\u7684\u4e09\u4e2a\u65b9\u6cd5\u4e0d\u662f\u5fc5\u9700\u7684\uff0c\u4f7f\u7528\u8005\u53ef\u4ee5\u6839\u636e\u81ea\u8eab\u9700\u8981\uff0c\u81ea\u884c\u51b3\u5b9a\u9700\u8981\u5728\u76d1\u542c\u5668\u4e2d\u5b9a\u4e49\u7684\u65b9\u6cd5\u3002</p> <ul> <li>\u5728<code>EventBus</code>\u4e2d\u6ce8\u518c\u4e8b\u4ef6\u76d1\u542c\u5668</li> </ul> <pre><code>EventManager.getEventBus().register(receiveEvent);\n</code></pre>"},{"location":"general-development/CORS.html","title":"\u8de8\u57df\u8d44\u6e90\u5171\u4eab(CORS)","text":""},{"location":"general-development/CORS.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u8de8\u57df\u8d44\u6e90\u5171\u4eab(CORS, Cross-Origin Resource Sharing)\u5141\u8bb8\u6d4f\u89c8\u5668\u5b89\u5168\u7684\u8fdb\u884c\u8de8\u57df\u8d44\u6e90\u8bbf\u95ee\u3002</p>"},{"location":"general-development/CORS.html#_2","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u5f53\u7528\u6237\u9700\u8981\u4ece\u6d4f\u89c8\u5668\u4e0a\u8de8\u57df\u53d1\u9001REST\u8bf7\u6c42\u65f6\u5c31\u6709\u53ef\u80fd\u8981\u7528\u5230CORS\u673a\u5236\uff0c\u63a5\u6536\u8de8\u57df\u8bf7\u6c42\u7684\u5fae\u670d\u52a1\u9700\u8981\u5f00\u542fCORS\u652f\u6301\u3002</p>"},{"location":"general-development/CORS.html#_3","title":"\u914d\u7f6e\u8bf4\u660e","text":"<p>CORS\u529f\u80fd\u5728microservice.yaml\u6587\u4ef6\u4e2d\u914d\u7f6e\uff0c\u914d\u7f6e\u9879\u89c1\u4e0b\u8868\u6240\u8ff0\u3002</p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u53d6\u503c\u8303\u56f4 \u662f\u5426\u5fc5\u9009 \u542b\u4e49 \u6ce8\u610f servicecomb.cors.enabled <code>false</code> <code>true</code>/<code>false</code> \u5426 \u662f\u5426\u5f00\u542fCORS\u529f\u80fd - servicecomb.cors.origin <code>*</code> - \u5426 Access-Control-Allow-Origin \u591a\u4e2a\u503c\u4f7f\u7528\u9017\u53f7\u5206\u9694 servicecomb.cors.allowCredentials <code>false</code> <code>true</code>/<code>false</code> \u5426 Access-Control-Allow-Credentials \u6839\u636eCORS\u6807\u51c6\uff0c\u5f53Access-Control-Allow-Credentials\u8bbe\u7f6e\u4e3a<code>true</code>\u65f6\uff0cAccess-Control-Allow-Origin\u4e0d\u53ef\u8bbe\u7f6e\u4e3a\"*\"\uff0c\u5426\u5219\u5c06\u4f1a\u629b\u51fa\u5f02\u5e38 servicecomb.cors.allowedHeader \u65e0 - \u5426 Access-Control-Allow-Headers \u591a\u4e2a\u503c\u4f7f\u7528\u9017\u53f7\u5206\u9694 servicecomb.cors.allowedMethod \u65e0 - \u5426 Access-Control-Allow-Methods \u591a\u4e2a\u503c\u4f7f\u7528\u9017\u53f7\u5206\u9694 servicecomb.cors.exposedHeader \u65e0 - \u5426 Access-Control-Expose-Headers \u591a\u4e2a\u503c\u4f7f\u7528\u9017\u53f7\u5206\u9694 servicecomb.cors.maxAge \u65e0 (0,2147483647]\uff0c\u6574\u578b \u5426 Access-Control-Max-Age \u5355\u4f4d\u662f\u79d2\uff0c\u5982\u679c\u7528\u6237\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u5219CORS\u5e94\u7b54\u4e2d\u6ca1\u6709Access-Control-Max-Age"},{"location":"general-development/CORS.html#_4","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>\u5141\u8bb8\u6240\u6709\uff1a</p> <pre><code>servicecomb:\n cors:\n enabled: true\n origin: \"*\"\n allowCredentials: false\n allowedMethod: PUT,DELETE\n maxAge: 3600\n</code></pre> <p>\u5141\u8bb8\u5355\u4e2aorigin\uff1a</p> <pre><code>servicecomb:\n cors:\n enabled: true\n origin: \"http://test.domain:8080\"\n allowCredentials: false\n allowedMethod: PUT,DELETE\n maxAge: 3600\n</code></pre> <p>\u914d\u7f6e\u591a\u4e2aorigin\uff1a</p> <pre><code>servicecomb:\n cors:\n enabled: true\n origin: \"http://test.domain:8080,http://test.domain:9090\"\n allowCredentials: false\n allowedMethod: PUT,DELETE\n maxAge: 3600\n</code></pre>"},{"location":"general-development/config-logs.html","title":"\u914d\u7f6e\u65e5\u5fd7","text":"<p>java chassis \u7cfb\u7edf\u5185\u90e8\u5168\u90e8\u91c7\u7528 <code>slf4j</code> \u8bb0\u5f55\u65e5\u5fd7\u3002 <code>slf4j</code> \u662f\u4e00\u5957\u65e5\u5fd7 API \u6807\u51c6\uff0c\u5177\u4f53\u5b9e\u73b0\u53ef\u4ee5\u7531 <code>log4j</code>, <code>log4j2</code>, <code>logback</code> \u7b49 \u63d0\u4f9b\u3002 java chassis \u9ed8\u8ba4\u6ca1\u6709\u63d0\u4f9b\u5b9e\u73b0\u7684\u4f9d\u8d56\uff0c \u5f00\u53d1\u8005\u53ef\u4ee5\u9009\u9879\u4f9d\u8d56\u9002\u5408\u81ea\u5df1\u7684\u65e5\u5fd7\u5b9e\u73b0\uff0c \u4e0b\u9762\u7b80\u5355\u7684\u4ecb\u7ecd\u5982\u4f55\u5f15\u5165\u5e38\u89c1\u7684\u5b9e\u73b0\u3002</p> <ul> <li>log4j2</li> </ul> <p>\u4f7f\u7528 log4j2 \u9700\u8981\u5728\u9879\u76ee\u4e2d\u63d0\u4f9b\u5982\u4e0b\u4f9d\u8d56\u3002</p> <pre><code>&lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;\n &lt;artifactId&gt;log4j-slf4j-impl&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;\n &lt;artifactId&gt;log4j-api&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;\n &lt;artifactId&gt;log4j-core&lt;/artifactId&gt;\n &lt;/dependency&gt;\n&lt;/dependencies&gt;\n</code></pre> <ul> <li>logback</li> </ul> <p>\u4f7f\u7528 logback \u9700\u8981\u5728\u9879\u76ee\u4e2d\u63d0\u4f9b\u5982\u4e0b\u4f9d\u8d56\u3002</p> <pre><code>&lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;\n &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;\n &lt;/dependency&gt;\n&lt;/dependencies&gt;\n</code></pre> <p>\u5fae\u670d\u52a1\u67b6\u6784\u4e0b\uff0c\u9700\u8981\u90e8\u7f72\u5927\u91cf\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u8c03\u7528\u60c5\u51b5\u590d\u6742\uff0c\u7ed9\u95ee\u9898\u5b9a\u4f4d\u5e26\u6765\u4e86\u5f88\u5927\u7684\u9ebb\u70e6\u3002 \u901a\u8fc7\u8c03\u7528\u94fe\u7cfb\u7edf\u80fd\u591f\u5f88\u597d\u7684\u89e3\u51b3\u65e5\u5fd7\u8ffd\u8e2a\u7684\u95ee\u9898\uff0c\u4f46\u662f\u5bf9\u4e8e\u65e5\u5e38\u7684\u5f00\u53d1\u8c03\u8bd5\uff0c\u90e8\u7f72\u8c03\u7528\u94fe\u4ecd\u7136\u663e\u5f97\u590d\u6742\u3002 java-chassis \u63d0\u4f9b\u4e86\u4e00\u79cd\u7b80\u5355\u7684\u673a\u5236\uff0c\u5141\u8bb8\u4e1a\u52a1\u5728\u8bb0\u5f55\u65e5\u5fd7\u7684\u65f6\u5019\uff0c\u5305\u542btrace id\u3002</p>"},{"location":"general-development/config-logs.html#trace-id","title":"\u5728\u65e5\u5fd7\u7cfb\u7edf\u4e2d\u8bb0\u5f55 trace id","text":"<p>\u53ef\u4ee5\u5728 log4j2 \u6216\u8005 logback \u4e2d\u4f7f\u7528 MDC \u7684\u65b9\u5f0f\u8bb0\u5f55 trace id\u3002</p> <p>log4j2\u7684\u914d\u7f6e\u5982\u4e0b\uff1a</p> <pre><code> &lt;Appenders&gt;\n &lt;Console name=\"Console\" target=\"SYSTEM_OUT\"&gt;\n &lt;PatternLayout pattern=\"[%d][%t][%p][%c:%L][%X{SERVICECOMB_TRACE_ID}] %m%n\"/&gt;\n &lt;/Console&gt;\n &lt;/Appenders&gt;\n</code></pre> <p>logback\u7684\u914d\u7f6e\u5982\u4e0b:</p> <pre><code> &lt;appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\"&gt;\n &lt;encoder&gt;\n &lt;pattern&gt;%d [%level] [%thread][%X{SERVICECOMB_TRACE_ID}] - %msg (%F:%L\\)%n&lt;/pattern&gt;\n &lt;/encoder&gt;\n &lt;/appender&gt;\n</code></pre>"},{"location":"general-development/context.html","title":"\u4f7f\u7528Context\u4f20\u9012\u63a7\u5236\u6d88\u606f","text":"<p>Context \u7528\u4e8e\u5728\u5fae\u670d\u52a1\u4e4b\u95f4\u548c\u5fae\u670d\u52a1\u5185\u90e8\u4f20\u9012\u4e0a\u4e0b\u6587\u6570\u636e\u3002 Context \u662f key/value \u5bf9\uff0c\u53ea\u80fd\u591f\u4f7f\u7528 String \u7c7b\u578b\u3002 Context \u4f1a\u5e8f\u5217\u5316\u4e3a json \u683c\u5f0f\u5e76\u901a\u8fc7 HTTP Header \u4f20\u9012\uff0c\u56e0\u6b64\u4e5f\u4e0d\u652f\u6301 ASCII \u4e4b\u5916\u7684\u5b57\u7b26\uff0c\u5176\u4ed6\u5b57\u7b26\u9700\u8981\u5f00\u53d1\u8005\u5148\u81ea\u884c\u7f16\u7801\u518d\u4f20\u9012\u3002 Context \u5728\u4e00\u6b21\u8bf7\u6c42\u4e2d\uff0c\u4f1a\u5728\u8bf7\u6c42\u94fe\u4e0a\u4f20\u9012\uff0c\u4e0d\u9700\u8981\u91cd\u65b0\u8bbe\u7f6e\u3002access log\u7684 trace id \u7b49 \u529f\u80fd\u90fd\u57fa\u4e8e\u8fd9\u4e2a\u7279\u6027\u5b9e\u73b0\u7684\u3002</p> <p>Context \u4fdd\u5b58\u7684\u5185\u5bb9\u5206\u4e3a context \u548c localContext\u3002 localContext \u5728\u8c03\u7528\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u5728\u8fdb\u7a0b\u5185\u90e8\u4f20\u9012\uff0c \u800c context \u7684\u5185\u5bb9\u4f1a\u4f20\u9012\u5230\u8c03\u7528\u8fc7\u7a0b\u4e2d \u8fdc\u7aef\u670d\u52a1\u3002 \u8fd9\u79cd\u4f20\u9012\u662f\u5355\u5411\u7684\u3002\u6bd4\u5982\u5728\u4e00\u4e2a Provider \u5185\u90e8\uff0c \u8c03\u7528\u63a5\u53e3\uff0c \u90a3\u4e48 localContext \u7684\u5185\u5bb9\u4f1a\u590d\u5236\u7ed9\u8c03\u7528\u63a5\u53e3\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684 localContext\uff0c \u5982\u679c\u8fd9\u4e2a\u63a5\u53e3\u5728\u8c03\u7528\u8fc7\u7a0b\u4e2d\u4fee\u6539\u4e86 localContext\uff0c \u63a5\u53e3\u8fd4\u56de\u540e\uff0c Provider \u540e\u7eed\u7684\u903b\u8f91\u5904\u7406\u770b\u4e0d\u5230\u5bf9\u4e8e context \u7684\u4fee\u6539\u3002 </p> <p>\u5728 Handler \u6216\u8005 Filter \u4e2d\u8c03\u7528\u5176\u4ed6\u5fae\u670d\u52a1\uff0c context \u4fe1\u606f\u9ed8\u8ba4\u4e0d\u4f1a\u590d\u5236\uff0c\u9700\u8981\u5f00\u53d1\u8005\u663e\u793a\u7684\u5c06 context \u4fe1\u606f\u4f20\u9012\u8fc7\u53bb\u3002 \u4f7f\u7528 RestTemplate \u6216\u8005 RPC \u65b9\u5f0f\u4f20\u9012 context \u7684\u4f8b\u5b50\uff0c\u8bf7\u53c2\u8003\u672c\u6587\u540e\u9762\u7684\u6848\u4f8b\u3002 </p>"},{"location":"general-development/context.html#context_1","title":"\u4f7f\u7528 Context \u7684\u573a\u666f","text":"<ul> <li>\u5728\u8ba4\u8bc1\u573a\u666f\uff0cEdge Service \u8ba4\u8bc1\u901a\u8fc7\u4ee5\u540e\uff0c\u9700\u8981\u5c06\u4f1a\u8bdd ID\u3001\u7528\u6237\u540d\u79f0\u7b49\u4fe1\u606f\u4f20\u9012\u7ed9\u5fae\u670d\u52a1\uff0c\u5b9e\u73b0\u9274\u6743\u7b49\u903b\u8f91\u3002</li> <li>\u7070\u5ea6\u53d1\u5e03\u573a\u666f\uff0c\u9700\u8981\u7ed3\u5408\u81ea\u5b9a\u4e49\u7684 tag \u5b9e\u73b0\u5f15\u6d41\uff0ctag \u4fe1\u606f\u9700\u8981\u4f20\u9012\u7ed9\u5fae\u670d\u52a1\u3002</li> <li>\u5f00\u53d1 Handler \u5904\u7406\u94fe\u7684\u65f6\u5019\uff0c\u4e00\u4e2a Handler \u9700\u8981\u5c06\u8ba1\u7b97\u7ed3\u679c\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a Handler\u3002</li> </ul>"},{"location":"general-development/context.html#_1","title":"\u4f7f\u7528\u53c2\u8003","text":"<ul> <li> <p>\u5728 Hanlder \u4e2d\u83b7\u53d6\u548c\u8bbe\u7f6eContext Handler \u5305\u542b\u4e86 Invocation \u5bf9\u8c61\uff0c\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528 invocation.addContext \u548c invocation.getContext \u3002</p> </li> <li> <p>\u5728\u670d\u52a1\u63a5\u53e3\u4e2d\u83b7\u53d6Context</p> <p>\u901a\u8fc7\u63a5\u53e3\u6ce8\u5165</p> <pre><code>```\npublic Response cseResponse(InvocationContext c1)\n```\n</code></pre> <p>\u6216\u8005</p> <pre><code>```\nContextUtils.getInvocationContext()\n```\n</code></pre> </li> <li> <p>\u5728Edge Service\u4e2d\u8bbe\u7f6eContext</p> <p>\u901a\u8fc7\u91cd\u8f7dEdgeInvocation</p> <pre><code>```\nEdgeInvocation edgeInvocation = new EdgeInvocation() {\n protected void createInvocation() {\n super.createInvocation();\n this.invocation.addContext(\"hello\", \"world\");\n }\n};\n```\n</code></pre> </li> </ul>"},{"location":"general-development/context.html#context-discoverytree","title":"\u6848\u4f8b\uff1a \u4f7f\u7528 Context \u548c DiscoveryTree \u5b9e\u73b0\u8f6e\u8be2\u8c03\u7528\u4e00\u4e2a\u5fae\u670d\u52a1\u7684\u6240\u6709\u5b9e\u4f8b","text":"<p>\u901a\u5e38\u5fae\u670d\u52a1\u7684\u8c03\u7528\uff0c\u662f\u5c06\u8bf7\u6c42\u53d1\u9001\u5230\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u8fd9\u4e2a\u5b9e\u4f8b\u662f\u6839\u636e\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u51b3\u5b9a\u7684\uff0c\u4e1a\u52a1\u5f00\u53d1\u4e0d\u53ef\u63a7\u5236\u3002\u4e3a\u4e86\u5b9e\u73b0\u8f6e\u8be2\u8c03\u7528\u4e00\u4e2a\u5fae\u670d\u52a1\u7684\u6240\u6709\u5b9e\u4f8b\uff0c \u9996\u5148\u9700\u8981\u83b7\u53d6\u4e00\u4e2a\u5fae\u670d\u52a1\u7684\u6240\u6709\u5b9e\u4f8b\u5217\u8868\uff0c\u7136\u540e\u9010\u4e2a\u8c03\u7528\u3002 LoadBalance \u6a21\u5757\u652f\u6301\u901a\u8fc7 Context \u4f20\u9012 Endpoint \u4fe1\u606f\uff0c \u5982\u679c Endpoint \u5df2\u7ecf \u8bbe\u7f6e\uff0c \u53ef\u4ee5\u8df3\u8fc7\u8d1f\u8f7d\u5747\u8861\u5224\u65ad\uff0c \u4f7f\u7528\u7528\u6237\u81ea\u5df1\u6307\u5b9a\u7684 Endpoint\u3002 </p> <ul> <li> <p>\u4f7f\u7528 DiscoveryTree \u83b7\u53d6\u5fae\u670d\u52a1\u5b9e\u4f8b\u5217\u8868</p> <pre><code>```java\npublic class TestDateTimeSchema {\n private DiscoveryTree discoveryTree = new DiscoveryTree();\n\n public TestDateTimeSchema() {\n discoveryTree.addFilter(new CustomEndpointDiscoveryFilter());\n discoveryTree.sort();\n }\n\n private void testDateTimeSchemaMulticast() throws Exception {\n DiscoveryContext context = new DiscoveryContext();\n VersionedCache serversVersionedCache = discoveryTree.discovery(context, \"springmvctest\", \"springmvc\", \"0+\");\n List&lt;String&gt; enpoints = serversVersionedCache.data(); // \u83b7\u53d6\u5230\u5b9e\u4f8b\u5217\u8868\uff0c\u53ef\u4ee5\u7ed9\u4e0b\u9762\u7684\u5904\u7406\u6d41\u7a0b\u4f7f\u7528\n }\n}\n\npublic class CustomEndpointDiscoveryFilter extends AbstractEndpointDiscoveryFilter {\n @Override\n protected String findTransportName(DiscoveryContext context, DiscoveryTreeNode parent) {\n //only need rest endpoints\n return \"rest\";\n }\n\n @Override\n protected Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance) {\n return endpoint;\n }\n\n @Override\n public int getOrder() {\n return 0;\n }\n}\n```\n</code></pre> <p>\u4e0a\u9762\u7684\u4ee3\u7801\u901a\u8fc7 DiscoveryTree \u53d1\u73b0\u5b9e\u4f8b\u5217\u8868\uff0c \u5e76\u4e14\u5b9e\u73b0\u4e86 CustomEndpointDiscoveryFilter \uff0c \u5c06\u53d1\u73b0\u7684\u5b9e\u4f8b\u4fe1\u606f\u8f6c\u6362\u4e3a cache \u7684\u8fd4\u56de \u7c7b\u578b\uff0c \u5373 String\u3002</p> </li> <li> <p>\u901a\u8fc7 InvocationContext \u4f20\u9012 Endpoint \u4fe1\u606f\u7ed9 Load Balance, \u6bcf\u6b21\u8c03\u7528\u8bbf\u95ee\u7528\u6237\u6307\u5b9a\u7684 Endpoint\u3002 \u8bbf\u95ee InvocationContext \u5206\u51e0\u79cd\u573a\u666f\uff0c \u53c2\u8003\u6587\u7ae0\u4e0a\u9762\u63d0\u5230\u7684\u60c5\u51b5\u3002 \u5728 Consumer \u8c03\u7528\u7684\u573a\u666f\u4e0b\uff0c \u53ef\u80fd\u4e0d\u5728\u4e00\u4e2a Provider \u7684\u5904\u7406\u4e0a\u4e0b\u6587\u4e2d\uff0c \u8fd9\u4e2a\u65f6\u5019\u7cfb\u7edf\u4e2d\u8fd8\u6ca1\u6709 InvocationContext \u5b9e\u4f8b\uff0c \u8fd9\u4e2a\u65f6\u5019\u53ef\u4ee5\u65b0\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\uff0c \u65b0\u521b\u5efa\u7684\u5b9e\u4f8b\u4fe1\u606f\u4f1a\u590d\u5236\u5230\u7cfb\u7edf\u5185\u90e8\u3002 </p> <p>\u4f7f\u7528 RPC Consumer \u4f20\u9012 InvocationContext \u7684\u4f8b\u5b50\uff1a</p> <pre><code>```java\n interface DateTimeSchemaWithContextInf {\n Date getDate(InvocationContext context, Date date);\n }\n\n @RpcReference(microserviceName = \"springmvc\", schemaId = \"DateTimeSchema\")\n private DateTimeSchemaWithContextInf dateTimeSchemaWithContextInf;\n\n // code slip\n for (String endpoint : enpoints) {\n InvocationContext invocationContext = new InvocationContext();\n invocationContext.addLocalContext(LoadbalanceHandler.SERVICECOMB_SERVER_ENDPOINT, parseEndpoint(endpoint));\n Date date = new Date();\n TestMgr.check(date.getTime(), dateTimeSchemaWithContextInf.getDate(invocationContext, date).getTime());\n }\n\n // code slip\n private Endpoint parseEndpoint(String endpointUri) throws Exception {\n URI formatUri = new URI(endpointUri);\n Transport transport = SCBEngine.getInstance().getTransportManager().findTransport(formatUri.getScheme());\n return new Endpoint(transport, endpointUri);\n }\n```\n</code></pre> <p>\u4f7f\u7528 RestTemplate \u4f20\u9012 InvocationContext \u7684\u4f8b\u5b50\uff1a</p> <pre><code>```\nfor (String endpoint : enpoints) {\n CseHttpEntity&lt;?&gt; entity = new CseHttpEntity&lt;&gt;(null);\n InvocationContext invocationContext = new InvocationContext();\n invocationContext.addLocalContext(LoadbalanceHandler.SERVICECOMB_SERVER_ENDPOINT, parseEndpoint(endpoint));\n entity.setContext(invocationContext);\n\n Date date = new Date();\n String dateValue = RestObjectMapperFactory.getRestObjectMapper().convertToString(date);\n TestMgr.check(date.getTime(),\n restTemplate\n .exchange(\"cse://springmvc/dateTime/getDate?date={1}\", HttpMethod.GET,\n entity, Date.class, dateValue).getBody().getTime());\n \uff5d\n ```\n</code></pre> <p>\u6ce8\u610f\uff1a 2.0.2 \u7248\u672c\u5f00\u59cb\uff0c LoadbalanceHandler.SERVICECOMB_SERVER_ENDPOINT \u4f20\u9012\u7684\u7c7b\u578b\u662f Endpoint, \u65e9\u671f\u7248\u672c\u53ef\u4ee5\u76f4\u63a5\u4f20\u9012 String \u7c7b\u578b\uff0c LoadBalance \u6a21\u5757\u4f1a\u5c06 String \u7c7b\u578b\u8f6c\u6362\u4e3a Endpoint\u3002 \u5728\u6709\u5927\u91cf Endpoint \u7684\u60c5\u51b5\uff0c \u63d0\u524d\u4f7f\u7528 Endpoint \u7c7b\u578b\u80fd\u591f\u51cf\u5c11\u7c7b\u578b\u8f6c\u6362\uff0c\u8282\u7701\u5904\u7406\u65f6\u95f4\u3002</p> </li> </ul>"},{"location":"general-development/cross-app-invocation.html","title":"\u8de8\u5e94\u7528\u8c03\u7528","text":""},{"location":"general-development/cross-app-invocation.html#_2","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u5e94\u7528\u662f\u5fae\u670d\u52a1\u5b9e\u4f8b\u9694\u79bb\u5c42\u6b21\u4e2d\u7684\u4e00\u5c42\uff0c\u4e00\u4e2a\u5e94\u7528\u5305\u542b\u591a\u4e2a\u5fae\u670d\u52a1\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u53ea\u5141\u8bb8\u540c\u5e94\u7528\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\u76f8\u4e92\u8c03\u7528\u3002</p>"},{"location":"general-development/cross-app-invocation.html#_3","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u5f53\u7528\u6237\u9700\u8981\u4e0d\u540c\u5e94\u7528\u95f4\u7684\u5fae\u670d\u52a1\u76f8\u4e92\u8c03\u7528\u65f6\uff0c\u5c31\u9700\u8981\u5f00\u542f\u8de8\u5e94\u7528\u8c03\u7528\u529f\u80fd\u3002</p>"},{"location":"general-development/cross-app-invocation.html#_4","title":"\u914d\u7f6e\u8bf4\u660e","text":"<p>\u82e5\u8981\u5f00\u542f\u8de8\u5e94\u7528\u8c03\u7528\uff0c\u9996\u5148\u9700\u5728provider\u7aef\u7684microservice.yaml\u6587\u4ef6\u5f00\u542f\u8de8\u5e94\u7528\u8c03\u7528\u914d\u7f6e\u3002 \u6ce8\u610f\uff1a \u9700\u8981\u5347\u7ea7\u5fae\u670d\u52a1\u7248\u672c\u53f7\uff0c\u4ee5\u4fbf\u5728\u670d\u52a1\u4e2d\u5fc3\u91cd\u65b0\u6ce8\u518c\u5fae\u670d\u52a1\u4fe1\u606f \u5373\u4f7f\u662fdevelopment\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u9700\u8981\u5347\u7ea7\u5fae\u670d\u52a1\u7248\u672c\u53f7\uff0c\u56e0\u4e3adevelopment\u73af\u5883\u4e0b\uff0c\u4e5f\u53ea\u6709\u5951\u7ea6\u53d1\u751f\u53d8\u5316\uff0c\u624d\u4f1a\u91cd\u65b0\u6ce8\u518c\u5951\u7ea6</p> <p>\u914d\u7f6e\u9879\u5982\u4e0b\uff1a</p> <pre><code>service_description:\n # other configuration omitted\n properties:\n allowCrossApp: true # enable cross app invocation\n</code></pre> <p>consumer\u7aef\u6307\u5b9a\u5fae\u670d\u52a1\u540d\u79f0\u8c03\u7528provider\u7684\u65f6\u5019\uff0c\u9700\u8981\u52a0\u4e0aprovider\u6240\u5c5e\u7684\u5e94\u7528ID\uff0c\u683c\u5f0f\u53d8\u4e3a<code>[appID]:[microserviceName]</code>\u3002</p>"},{"location":"general-development/cross-app-invocation.html#_5","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>\u793a\u4f8b\u5047\u8bbeprovider\u6240\u5c5e\u5e94\u7528\u4e3ahelloApp\uff0c\u5fae\u670d\u52a1\u540d\u79f0\u4e3ahelloProvider\uff1bconsumer\u6240\u5c5e\u5e94\u7528\u4e3ahelloApp2\uff0c\u5fae\u670d\u52a1\u540d\u79f0\u4e3ahelloConsumer\u3002</p> <ul> <li>RestTemplate\u8c03\u7528\u65b9\u5f0f</li> </ul> <p>\u5f53consumer\u7aef\u4ee5RestTemplate\u65b9\u5f0f\u5f00\u53d1\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u65f6\uff0c\u9700\u8981\u5728\u8c03\u7528\u7684URL\u4e2d\u5c06<code>[microserviceName]</code>\u6539\u4e3a<code>[appID]:[microserviceName]</code>\uff0c\u4ee3\u7801\u793a\u4f8b\u5982\u4e0b\uff1a ```java RestTemplate restTemplate = RestTemplateBuilder.create();</p> <pre><code>ResponseEntity&lt;String&gt; responseEntity = restTemplate\n .getForEntity(\"cse://helloApp:helloProvider/hello/sayHello?name={name}\",\n String.class, \"ServiceComb\");\n</code></pre> <p>```</p> <ul> <li>RPC\u8c03\u7528\u65b9\u5f0f</li> </ul> <p>\u5f53consumer\u7aef\u4ee5RPC\u65b9\u5f0f\u5f00\u53d1\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u65f6\uff0c\u58f0\u660e\u7684\u670d\u52a1\u63d0\u4f9b\u8005\u4ee3\u7406\u5982\u4e0b\uff1a <code>java @RpcReference(schemaId = \"hello\", microserviceName = \"helloApp:helloProvider\") private Hello hello;</code> \u8de8\u5e94\u7528\u8c03\u7528\u4e0e\u540c\u5e94\u7528\u4e0b\u8c03\u7528\u5fae\u670d\u52a1\u7684\u65b9\u5f0f\u76f8\u540c\uff1a <code>java hello.sayHello(\"ServiceComb\");</code></p>"},{"location":"general-development/customized-tracing.html","title":"\u81ea\u5b9a\u4e49\u8c03\u7528\u94fe\u6253\u70b9","text":""},{"location":"general-development/customized-tracing.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u5206\u5e03\u5f0f\u8c03\u7528\u94fe\u8ffd\u8e2a\u63d0\u4f9b\u4e86\u670d\u52a1\u95f4\u8c03\u7528\u7684\u65f6\u5e8f\u4fe1\u606f\uff0c\u4f46\u670d\u52a1\u5185\u90e8\u7684\u94fe\u8def\u8c03\u7528\u4fe1\u606f\u5bf9\u5f00\u53d1\u8005\u540c\u6837\u91cd\u8981\uff0c\u5982\u679c\u80fd\u5c06\u4e24\u8005\u5408\u4e8c\u4e3a\u4e00\uff0c\u5c31\u80fd\u63d0\u4f9b\u66f4\u5b8c\u6574\u7684\u8c03\u7528\u94fe\uff0c\u66f4\u5bb9\u6613\u5b9a\u4f4d\u9519\u8bef\u548c\u6f5c\u5728\u6027\u80fd\u95ee\u9898\u3002</p>"},{"location":"general-development/customized-tracing.html#_2","title":"\u524d\u63d0\u6761\u4ef6","text":"<ul> <li>\u4f7f\u7528\u81ea\u5b9a\u4e49\u6253\u70b9\u529f\u80fd\u9700\u8981\u9996\u5148\u914d\u7f6e\u5e76\u542f\u7528Java Chassis\u5fae\u670d\u52a1\u8c03\u7528\u94fe\u3002</li> </ul>"},{"location":"general-development/customized-tracing.html#_3","title":"\u6ce8\u610f\u4e8b\u9879","text":"<ul> <li>\u4f7f\u7528<code>@Span</code>\u6ce8\u91ca\u7684\u81ea\u5b9a\u4e49\u6253\u70b9\u529f\u80fd\u53ea\u652f\u6301\u548cJava Chassis\u8c03\u7528\u8bf7\u6c42\u540c\u4e00\u7ebf\u7a0b\u7684\u65b9\u6cd5\u8c03\u7528\u3002</li> <li>\u6dfb\u52a0<code>@Span</code>\u6ce8\u91ca\u7684\u65b9\u6cd5\u5fc5\u987b\u662fSpring\u7ba1\u7406\u7684Bean\uff0c\u5426\u5219\u9700\u8981\u6309\u8fd9\u91cc\u63d0\u5230\u7684\u65b9\u6cd5\u914d\u7f6e\u3002</li> </ul>"},{"location":"general-development/customized-tracing.html#_4","title":"\u81ea\u5b9a\u4e49\u8c03\u7528\u94fe\u6253\u70b9","text":"<p>\u8be5\u529f\u80fd\u96c6\u6210\u4e86Zipkin\uff0c\u63d0\u4f9b<code>@Span</code>\u6ce8\u91ca\u4e3a\u9700\u8981\u8ffd\u8e2a\u7684\u65b9\u6cd5\u81ea\u5b9a\u4e49\u6253\u70b9\u3002Java Chassis\u5c06\u81ea\u52a8\u8ffd\u8e2a\u6240\u6709\u6dfb\u52a0<code>@Span</code>\u6ce8\u91ca\u7684\u65b9\u6cd5\uff0c\u628a\u6bcf\u4e2a\u65b9\u6cd5\u7684\u672c\u5730\u8c03\u7528\u4fe1\u606f\u4e0e\u670d\u52a1\u95f4\u8c03\u7528\u4fe1\u606f\u8fde\u63a5\u8d77\u6765\u3002</p>"},{"location":"general-development/customized-tracing.html#_5","title":"\u4f7f\u7528\u6b65\u9aa4:","text":""},{"location":"general-development/customized-tracing.html#_6","title":"\u6dfb\u52a0\u4f9d\u8d56","text":"<p>\u57fa\u4e8e ServiceComb Java Chassis \u7684\u5fae\u670d\u52a1\u53ea\u9700\u8981\u6dfb\u52a0\u5982\u4e0b\u4f9d\u8d56\u5230 pom.xml\uff1a</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;tracing-zipkin&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre>"},{"location":"general-development/customized-tracing.html#_7","title":"\u542f\u7528\u81ea\u5b9a\u4e49\u6253\u70b9\u529f\u80fd {#\u914d\u7f6e\u8ffd\u8e2a\u5904\u7406\u548c\u6570\u636e\u6536\u96c6}","text":"<p>\u5728\u5e94\u7528\u5165\u53e3\u6216Spring\u914d\u7f6e\u7c7b\u4e0a\u6dfb\u52a0<code>@EnableZipkinTracing</code>\u6ce8\u91ca\uff1a</p> <pre><code>@SpringBootApplication\n@EnableZipkinTracing\npublic class ZipkinSpanTestApplication {\n public static void main(String[] args) {\n SpringApplication.run(ZipkinSpanTestApplication.class);\n }\n}\n</code></pre>"},{"location":"general-development/customized-tracing.html#_8","title":"\u5b9a\u5236\u6253\u70b9","text":"<p>\u5728\u9700\u8981\u5b9a\u5236\u6253\u70b9\u7684\u65b9\u6cd5\u4e0a\u6dfb\u52a0<code>@Span</code>\u6ce8\u91ca\uff1a</p> <pre><code>@Component\npublic class SlowRepoImpl implements SlowRepo {\n private static final Logger logger = LoggerFactory.getLogger(SlowRepoImpl.class);\n\n private final Random random = new Random();\n\n @Span\n @Override\n public String crawl() throws InterruptedException {\n logger.info(\"in /crawl\");\n Thread.sleep(random.nextInt(200));\n return \"crawled\";\n }\n}\n</code></pre> <p>\u5c31\u8fd9\u6837\uff0c\u901a\u8fc7\u4f7f\u7528<code>@Span</code>\u6ce8\u91ca\uff0c\u6211\u4eec\u542f\u52a8\u4e86\u57fa\u4e8e Zipkin \u7684\u81ea\u5b9a\u4e49\u6253\u70b9\u529f\u80fd\u3002</p>"},{"location":"general-development/customized-tracing.html#_9","title":"\u5b9a\u5236\u4e0a\u62a5\u7684\u6570\u636e","text":"<p>\u901a\u8fc7\u81ea\u5b9a\u4e49\u6253\u70b9\u4e0a\u62a5\u7684\u8c03\u7528\u94fe\u5305\u542b\u4e24\u6761\u6570\u636e\uff1a</p> <ul> <li>span name \u9ed8\u8ba4\u4e3a\u5f53\u524d\u6ce8\u91ca\u7684\u65b9\u6cd5\u5168\u540d\u3002</li> <li>call.path \u9ed8\u8ba4\u4e3a\u5f53\u524d\u6ce8\u91ca\u7684\u65b9\u6cd5\u7b7e\u540d\u3002</li> </ul> <p>\u4f8b\u5982\uff0c\u4e0a\u8ff0\u4f8b\u5b50<code>SlowRepoImp</code>\u91cc\u4e0a\u62a5\u7684\u6570\u636e\u5982\u4e0b\uff1a</p> key value span name crawl call.path public abstract java.lang.String org.apache.servicecomb.tests.tracing.SlowRepo.crawl() throws java.lang.InterruptedException <p>\u5982\u679c\u9700\u8981\u5b9a\u5236\u4e0a\u62a5\u7684\u6570\u636e\u5185\u5bb9\uff0c\u53ef\u4ee5\u4f20\u5165\u81ea\u5b9a\u4e49\u7684\u53c2\u6570\uff1a</p> <pre><code> public static class CustomSpanTask {\n @Span(spanName = \"transaction1\", callPath = \"startA\")\n public String invoke() {\n return \"invoke the method\";\n }\n }\n</code></pre>"},{"location":"general-development/dnsconfig.html","title":"DNS\u81ea\u5b9a\u4e49\u914d\u7f6e","text":""},{"location":"general-development/dnsconfig.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7528\u6237\u4f7f\u7528\u57df\u540d\u8fde\u63a5\u516c\u6709\u4e91\u6216\u8005\u4e09\u65b9\u7cfb\u7edf\u65f6\uff0c\u9700\u8981\u4f7f\u7528\u5230\u57df\u540d\u89e3\u6790\u7cfb\u7edf\u3002\u5728\u4e0d\u540c\u7684\u7cfb\u7edf\u3001\u4e0d\u540c\u7684\u6846\u67b6\u4f7f\u7528\u7684\u57df\u540d\u89e3\u6790\u673a\u5236\u90fd\u53ef\u80fd\u4e0d\u592a\u4e00\u6837\u3002\u6240\u4ee5\u6211\u4eec\u6709\u5fc5\u8981\u63d0\u4f9b\u4e00\u4e2a\u7edf\u4e00\u7684\u914d\u7f6e\u5165\u53e3\uff0c\u4ee5\u4fbf\u5f00\u53d1\u8fd0\u7ef4\u4eba\u5458\u53ef\u4ee5\u81ea\u5b9a\u4e49DNS\u89e3\u6790\u673a\u5236\uff0c\u800c\u4e0d\u5b8c\u5168\u53d7\u5236\u4e8e\u7cfb\u7edf\u914d\u7f6e\u3002</p>"},{"location":"general-development/dnsconfig.html#dns","title":"DNS\u914d\u7f6e","text":"<p>DNS\u914d\u7f6e\u9879\u5199\u5728microservice.yaml\u6587\u4ef6\u4e2d\uff0c\u652f\u6301\u7edf\u4e00\u5236\u5b9a\u8bc1\u4e66\uff0c\u4e5f\u53ef\u4ee5\u6dfb\u52a0tag\u8fdb\u884c\u66f4\u7ec6\u7c92\u5ea6\u7684\u914d\u7f6e\uff0c\u6709tag\u7684\u914d\u7f6e\u4f1a\u8986\u76d6\u5168\u5c40\u914d\u7f6e\uff0c\u914d\u7f6e\u683c\u5f0f\u5982\u4e0b\uff1a</p> <pre><code>addressResolver.[tag].[property]\n</code></pre> <p>\u5e38\u89c1\u7684tag\u5982\u4e0b\u8868\uff1a </p> \u9879\u76ee tag \u670d\u52a1\u4e2d\u5fc3 sc.consumer \u914d\u7f6e\u4e2d\u5fc3 cc.consumer \u770b\u677f\u4e2d\u5fc3 mc.consumer \u7528\u6237\u81ea\u5b9a\u4e49 self.tag <p>\u5404\u4e2aproperties\u8be6\u7ec6\u8bf4\u660e\uff08\u8bbe\u7f6eVertx DNS\u89e3\u6790\uff09 </p> <pre><code>addressResolver:\n servers: 8.8.8.8,8.8.4.4 #\u5bf9\u5e94Linux /etc/resolv.conf\u7684nameserver,DNS\u670d\u52a1\u5668\u5730\u5740\uff0c\u652f\u6301\u914d\u7f6e\u591a\u4e2a\uff0c\u4ee5\u9017\u53f7\u9694\u5f00\n ndots: 1 #\u5bf9\u5e94linux /etc/resolv.conf\u91cc\u9762\u7684options: ndots, \u4f5c\u7528\u5c31\u662f\u5982\u679c\u7ed9\u7684\u57df\u540d\u91cc\u9762\u5305\u542b\u7684\u70b9\u7684\u4e2a\u6570\u5c11\u4e8e\u8be5\u9608\u503c\uff0c\u90a3\u4e48DNS\u89e3\u6790\u7684\u65f6\u5019\u5c31\u4f1a\u9ed8\u8ba4\u52a0\u4e0asearchDomains\u7684\u503c\uff0c\u8fd9\u4e2a\u5fc5\u987b\u548csearchDomains\u642d\u914d\u4f7f\u7528\uff0cLinux\u9ed8\u8ba4\u4e3a1\n searchDomains: a,b,c #\u5bf9\u5e94linux /etc/resolv.conf\u91cc\u9762\u7684search\uff0c\u548cndots\u642d\u914d\u4f7f\u7528\uff0c\u5982\u679c\u5f53\u524d\u57df\u540d\u7684\u70b9\u4e2a\u6570\u5c11\u4e8e\u8bbe\u7f6e\u503c\uff0c\u89e3\u6790\u65f6\u5c31\u4f1a\u628a\u8fd9\u4e9b\u503c\u6dfb\u52a0\u5230\u57df\u540d\u540e\u9762\u4e00\u8d77\u89e3\u6790\uff0c\u6bd4\u5982ndots\u8bbe\u7f6e\u7684\u4e3a4\uff0c\u5f53\u524d\u57df\u540d\u4e3aservicecomb.cn-north-1.myhwclouds.com\uff0c\u53ea\u6709\u4e09\u4e2a\u70b9\uff0c\u90a3\u4e48\u89e3\u6790\u7684\u65f6\u5019\u5c31\u4f1a\u81ea\u52a8\u52a0\u4e0aservicecomb.cn-north-1.myhwclouds.com.a\u53bb\u89e3\u6790\uff0c\u6ca1\u89e3\u6790\u51fa\u6765\u5728\u7528servicecomb.cn-north-1.myhwclouds.com.b\uff0c\u76f4\u5230\u80fd\u6700\u540e\u89e3\u6790\u51fa\u6765\n optResourceEnabled: true #optional record is automatically included in DNS queries\n cacheMinTimeToLive: 0 #\u6700\u5c0f\u7f13\u5b58\u65f6\u95f4\n cacheMaxTimeToLive: 10000 #\u6700\u5927\u7f13\u5b58\u65f6\u95f4\n cacheNegativeTimeToLive: 0 #DNS\u89e3\u6790\u5931\u8d25\u540e\uff0c\u4e0b\u6b21\u91cd\u8bd5\u7684\u7b49\u5f85\u65f6\u95f4\n queryTimeout: 5000 #\u67e5\u8be2\u8d85\u65f6\u65f6\u95f4\n maxQueries: 4 #\u67e5\u8be2\u6b21\u6570\n rdFlag: true #\u8bbe\u7f6eDNS\u9012\u5f52\u67e5\u8be2\n rotateServers: true #\u8bbe\u7f6e\u662f\u5426\u652f\u6301\u8f6e\u8be2\n</code></pre>"},{"location":"general-development/dnsconfig.html#_2","title":"\u793a\u4f8b","text":"<pre><code>VertxOptions vertxOptions = new VertxOptions();\nvertxOptions.setAddressResolverOptions(AddressResolverConfig.getAddressResover(\"self.tag\"));\nVertx vertx = VertxUtils.getOrCreateVertxByName(\"registry\", vertxOptions);\n// this has to set the client options\nHttpClientOptions httpClientOptions = createHttpClientOptions();\nClientPoolManager&lt;HttpClientWithContext&gt; clientMgr = new ClientPoolManager&lt;&gt;(vertx, new HttpClientPoolFactory(httpClientOptions));\nclientMgr.findThreadBindClientPool().runOnContext(httpClient -&gt; {\n // do some http request\n});\n</code></pre>"},{"location":"general-development/error-handling.html","title":"\u5f02\u5e38\u5904\u7406","text":""},{"location":"general-development/error-handling.html#_2","title":"\u5f02\u5e38\u5206\u7c7b\u53ca\u5ba2\u6237\u7aef\u5982\u4f55\u5224\u65ad\u5f02\u5e38\u7c7b\u578b","text":"<ul> <li>\u4e1a\u52a1\u5f02\u5e38\uff1a\u8fd9\u7c7b\u5f02\u5e38\u7531\u4e1a\u52a1\u63a5\u53e3\u5b9a\u4e49\u3002\u7528\u6237\u5728\u83b7\u53d6\u5230\u670d\u52a1swagger\u5b9a\u4e49\u7684\u65f6\u5019\uff0c\u5c31\u80fd\u591f\u4ece\u5b9a\u4e49\u4e2d\u770b\u5230\u8fd9\u7c7b\u5f02\u5e38\u5bf9 \u5e94\u7684\u9519\u8bef\u7801\uff0c\u4ee5\u53ca\u8fd4\u56de\u503c\u7c7b\u578b\u3002 \u4e0b\u9762\u7684\u4f8b\u5b50\u5c55\u73b0\u4e86\u4e1a\u52a1\u5b9a\u4e49\u5f02\u5e38\u3002<pre><code>@Path(\"/errorCode\")\n@POST\n@ApiResponses({\n @ApiResponse(code = 200, response = MultiResponse200.class, message = \"\"),\n @ApiResponse(code = 400, response = MultiResponse400.class, message = \"\"),\n @ApiResponse(code = 500, response = MultiResponse500.class, message = \"\")})\npublic MultiResponse200 errorCode(MultiRequest request) {\n if (request.getCode() == 400) {\n MultiResponse400 r = new MultiResponse400();\n r.setCode(400);\n r.setMessage(\"bad request\");\n throw new InvocationException(javax.ws.rs.core.Response.Status.BAD_REQUEST, r);\n } else if (request.getCode() == 500) {\n MultiResponse500 r = new MultiResponse500();\n r.setCode(500);\n r.setMessage(\"internal error\");\n throw new InvocationException(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, r);\n } else {\n MultiResponse200 r = new MultiResponse200();\n r.setCode(200);\n r.setMessage(\"success result\");\n return r;\n }\n}\n</code></pre> </li> </ul> <p>\u6ce8\u610f\uff1a \u5bf9\u4e8e 2xx \u9519\u8bef\u7801\uff0c\u53ef\u4ee5\u8fd4\u56de\u5177\u4f53\u7684\u4e1a\u52a1 model\uff0c \u5bf9\u4e8e\u5176\u4ed6\u7684\u9519\u8bef\u7801\uff0c \u5fc5\u987b\u629b\u51fa InvocationException\u3002 </p> <p>\u5ba2\u6237\u7aef\u4ee3\u7801\u53ef\u4ee5\u6309\u7167\u5982\u4e0b\u65b9\u5f0f\u5904\u7406\u5f02\u5e38\u3002\u5f02\u5e38\u7684\u7c7b\u578b\u662f\u786e\u5b9a\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7cast\u83b7\u53d6\u5230\u5f02\u5e38\u7c7b\u578b\u3002</p> <pre><code> MultiRequest request = new MultiRequest();\n\n request.setCode(200);\n ResponseEntity&lt;MultiResponse200&gt; result = template\n .postForEntity(SERVER + \"/MultiErrorCodeService/errorCode\", request, MultiResponse200.class);\n TestMgr.check(result.getStatusCode(), 200);\n TestMgr.check(result.getBody().getMessage(), \"success result\");\n\n request.setCode(400);\n MultiResponse400 t400 = null;\n try {\n template.postForEntity(SERVER + \"/MultiErrorCodeService/errorCode\", request, MultiResponse400.class);\n } catch (InvocationException e) {\n t400 = (MultiResponse400) e.getErrorData();\n }\n TestMgr.check(t400.getCode(), 400);\n TestMgr.check(t400.getMessage(), \"bad request\");\n\n request.setCode(500);\n MultiResponse500 t500 = null;\n try {\n template.postForEntity(SERVER + \"/MultiErrorCodeService/errorCode\", request, MultiResponse400.class);\n } catch (InvocationException e) {\n t500 = (MultiResponse500) e.getErrorData();\n }\n TestMgr.check(t500.getCode(), 500);\n TestMgr.check(t500.getMessage(), \"internal error\");\n</code></pre> <ul> <li>\u63a7\u5236\u5f02\u5e38\uff1a\u8fd9\u7c7b\u5f02\u5e38\u901a\u5e38\u662f\u6846\u67b6\u5904\u7406\u6d41\u7a0b\u4e0a\u7684\u5f02\u5e38\u3002\u6bd4\u5982\u6d41\u63a7Handler\u629b\u51faTOO_MANY_REQUESTS_STATUS\u5f02\u5e38\u3002<pre><code>public class ConsumerQpsFlowControlHandler implements Handler {\n ... ...\n if (qpsController.isLimitNewRequest()) {\n // return http status 429\n CommonExceptionData errorData = new CommonExceptionData(\"rejected by qps flowcontrol\");\n asyncResp.consumerFail(\n new InvocationException(QpsConst.TOO_MANY_REQUESTS_STATUS, errorData));\n return;\n }\n\n invocation.next(asyncResp);\n }\n}\n</code></pre> </li> </ul> <p>\u63a7\u5236\u5f02\u5e38\u5728\u63a5\u53e3\u5b9a\u4e49\u91cc\u9762\u6ca1\u6709\u58f0\u660e\u3002\u5ba2\u6237\u7aef\u5728\u505a\u5f02\u5e38\u5904\u7406\u7684\u65f6\u5019\uff0c\u4e0d\u77e5\u9053\u5f02\u5e38\u7c7b\u578b\u3002\u53ef\u4ee5\u91c7\u7528\u5f31\u7c7b\u578b\u7684\u65b9\u5f0f\u5904\u7406\u5f02\u5e38\uff1a</p> <pre><code> JsonObject requestJson = new JsonObject();\n requestJson.put(\"code\", 400);\n requestJson.put(\"message\", \"test message\");\n\n try {\n template\n .postForEntity(SERVER + \"/MultiErrorCodeService/noClientErrorCode\", requestJson, Object.class);\n } catch (InvocationException e) {\n TestMgr.check(e.getStatusCode(), 400);\n mapResult = RestObjectMapperFactory.getRestObjectMapper().convertValue(e.getErrorData(), Map.class);\n TestMgr.check(mapResult.get(\"message\"), \"test message\");\n TestMgr.check(mapResult.get(\"code\"), 400);\n TestMgr.check(mapResult.get(\"t400\"), 400);\n }\n</code></pre> <p>\u4e0a\u9762\u7684\u4ee3\u7801\u5047\u8bbe\u4e0d\u77e5\u9053\u5f02\u5e38\u7c7b\u578b\uff0c\u901a\u8fc7API\u5c06\u5f02\u5e38\u7c7b\u578b\u8f6c\u6362\u4e3aMap\u7c7b\u578b\uff0c\u7136\u540e\u4eceMap\u91cc\u9762\u8bfb\u53d6\u5f02\u5e38\u7c7b\u578b\u3002 ServiceComb\u81ea\u5df1\u629b\u51fa\u7684\u5f02\u5e38\u7c7b\u578b\u4e2d\uff0c\u4e00\u822c\u63a7\u5236\u5f02\u5e38\u7684\u7c7b\u578b\u4e5f\u662f\u56fa\u5b9a\u7684\uff0c\u4e3aCommonExceptionData\u3002</p> <ul> <li>\u672a\u77e5\u5f02\u5e38\uff1a\u8fd9\u7c7b\u5f02\u5e38\u53d1\u751f\u7684\u60c5\u51b5\u4e0d\u786e\u5b9a\u3002\u6bd4\u5982\u4e1a\u52a1\u4ee3\u7801\u5b9e\u73b0\u7684\u65f6\u5019\uff0c\u629b\u51faNullPointerException\u7b49\u672a\u6355\u83b7\u5f02\u5e38\u3001\u5e95\u5c42 \u7684\u7f51\u7edc\u8fde\u63a5\u8d85\u65f6\u5f02\u5e38\u7b49\u3002\u8fd9\u7c7b\u5f02\u5e38\u4f1a\u7531ServiceComb\u5c01\u88c5\u6210590\u6216\u8005490\u9519\u8bef\u8fd4\u56de\u3002\u6bd4\u5982\uff1a<pre><code>CommonExceptionData errorData = new CommonExceptionData(cause.getMessage());\nasyncResp.producerFail(new InvocationException(590, errorData)\n</code></pre> </li> </ul> <p>\u6216\u8005</p> <pre><code> asyncResp.consumerFail(new InvocationException(490, errorData)\n</code></pre> <p>\u672a\u77e5\u5f02\u5e38\u6d88\u606f\u7684\u7c7b\u578b\u56fa\u5b9a\u4e3aCommonExceptionData\u7c7b\u578b\u3002</p>"},{"location":"general-development/error-handling.html#_3","title":"\u5f02\u5e38\u62e6\u622a\u5668","text":"<p>\u6709\u65f6\u5019\uff0c\u4e1a\u52a1\u9700\u8981\u5c06\u6240\u6709\u7684\u672a\u77e5\u5f02\u5e38\u3001\u63a7\u5236\u5f02\u5e38\u8fdb\u884c\u6355\u83b7\uff0c\u8f6c\u6362\u4e3a\u5bf9\u7528\u6237\u53cb\u597d\u7684\u6d88\u606f\u3002\u6216\u8005\u5bf9\u63a7\u5236\u5f02\u5e38\u8fdb\u884c\u6355\u83b7\uff0c\u5c06 \u6d88\u606f\u4f53\u8f6c\u6362\u4e3a\u81ea\u5b9a\u4e49\u7684JSON\u683c\u5f0f\u3002\u8fd9\u91cc\u9762\u6709\u51e0\u4e2a\u53c2\u8003\u70b9\u3002</p> <ul> <li> <p>\u901a\u8fc7 <code>ExceptionToProducerResponseConverter</code> \u62e6\u622a\u5f02\u5e38</p> <p><code>ExceptionToProducerResponseConverter</code>\u80fd\u591f\u62e6\u622a\u4e1a\u52a1\u5f02\u5e38\u4ee5\u53ca\u4e1a\u52a1\u5b9e\u73b0\u91cc\u9762\u629b\u51fa\u7684\u672a\u77e5\u5f02\u5e38\u3002\u4f46\u662f\u4e0d\u80fd\u62e6\u622a Handler\uff0cHttpServerFilter \u7b49\u629b\u51fa\u7684\u5f02\u5e38\u3002\u66f4\u52a0\u786e\u5207\u7684\u662f <code>ProducerOperationHandler</code> \u6355\u83b7\u7684\u5f02\u5e38\u90fd\u4f1a\u88ab <code>ExceptionToProducerResponseConverter</code> \u5904\u7406\u3002 <code>ExceptionToProducerResponseConverter</code> \u5305\u542b\u5982\u4e0b \u51e0\u4e2a\u63a5\u53e3\uff1a</p> <ul> <li><code>getExceptionClass()</code> \u5b9e\u73b0\u7c7b\u6240\u5904\u7406\u7684\u5f02\u5e38\u7c7b\u578b\u3002\u5982\u679c\u8be5\u65b9\u6cd5\u8fd4\u56de<code>null</code>\uff0c\u5219\u8bf4\u660e\u6b64\u5b9e\u73b0\u7c7b\u4e3a\u9ed8\u8ba4converter\u3002</li> <li><code>Response convert(SwaggerInvocation swaggerInvocation, T e)</code> \u5904\u7406\u5f02\u5e38\u903b\u8f91\uff0c\u8be5\u65b9\u6cd5\u8fd4\u56de\u7684<code>Response</code>\u51b3\u5b9a\u4e86ServiceComb\u5c06\u4f1a\u8fd4\u56de\u4f55\u79cd\u72b6\u6001\u7801\u3001\u4f55\u79cdresponse body\u7684\u5e94\u7b54\u3002</li> <li><code>getOrder()</code> \u5b9e\u73b0\u7c7b\u7684\u4f18\u5148\u7ea7\uff0c\u8be5\u65b9\u6cd5\u8fd4\u56de\u7684\u503c\u8d8a\u5c0f\uff0c\u4f18\u5148\u7ea7\u8d8a\u9ad8\uff0c\u5982\u679c\u4e0d\u8986\u5199\u8be5\u65b9\u6cd5\u7684\u8bdd\uff0c\u5219\u8fd4\u56de\u9ed8\u8ba4\u4f18\u5148\u7ea7<code>0</code>\u3002\u5bf9\u4e8e\u5904\u7406\u540c\u4e00\u5f02\u5e38\u7c7b\u578b\u7684converter\uff08\u6216\u9ed8\u8ba4converter\uff09\uff0c\u53ea\u6709\u4f18\u5148\u7ea7\u6700\u9ad8\u7684\u751f\u6548\u3002</li> </ul> </li> </ul> <p>\u5728\u4e3a\u5f02\u5e38\u9009\u62e9converter\u65f6\uff0c\u4f1a\u4ece\u5f02\u5e38\u672c\u8eab\u7684\u7c7b\u578b\u5f00\u59cb\u5339\u914d\uff0c\u5982\u679c\u627e\u4e0d\u5230\u5bf9\u5e94\u7684converter\u5219\u9010\u7ea7\u5411\u4e0a\u67e5\u627e\u7236\u7c7b\u578b\u7684converter\u3002\u5f53\u5339\u914d\u5230<code>Throwable</code>\u4ecd\u672a\u627e\u5230converter\u65f6\uff0c\u5c06\u4f7f\u7528\u9ed8\u8ba4converter\u5904\u7406\u5f02\u5e38\u3002</p> <pre><code> public class CustomExceptionToProducerResponseConverter implements ExceptionToProducerResponseConverter&lt;IllegalStateException&gt; {\n @Override\n public Class&lt;IllegalStateException&gt; getExceptionClass() {\n // \u8fd4\u56deIllegalStateException\u8868\u793a\u8be5converter\u5904\u7406IllegalStateException\u7c7b\u578b\u7684\u5f02\u5e38\n return IllegalStateException.class;\n }\n\n @Override\n public int getOrder() {\n // \u8fd4\u56de\u7684order\u503c\u8d8a\u5c0f\uff0c\u4f18\u5148\u7ea7\u8d8a\u9ad8\n return 100;\n }\n\n @Override\n public Response convert(SwaggerInvocation swaggerInvocation, IllegalStateException e) {\n // \u8fd9\u91cc\u662f\u5904\u7406\u5f02\u5e38\u7684\u903b\u8f91\n IllegalStateErrorData data = new IllegalStateErrorData();\n data.setId(500);\n data.setMessage(e.getMessage());\n data.setState(e.getMessage());\n InvocationException state = new InvocationException(Status.INTERNAL_SERVER_ERROR, data);\n return Response.failResp(state);\n }\n }\n</code></pre> <p>\u8bf4\u660e : 2.0.2 \u4e4b\u524d\u7684\u7248\u672c\u90e8\u5206\u4e1a\u52a1\u5f02\u5e38\u65e0\u6cd5\u901a\u8fc7 ExceptionToProducerResponseConverter \u6355\u83b7\uff0c \u7cfb\u7edf\u505a\u4e86\u81ea\u52a8\u5904\u7406\uff0c\u4e0d\u7ecf\u8fc7 ExceptionToProducerResponseConverter\u3002 2.0.2 \u7248\u672c\u89c4\u8303\u5316\u4e86\u5904\u7406\u6d41\u7a0b\u3002 </p> <ul> <li>\u63a7\u5236\u6d88\u606f\u6d88\u606f\u4f53\u5e8f\u5217\u5316</li> </ul> <p>\u63a7\u5236\u6d88\u606f\u6d88\u606f\u4f53\u5e8f\u5217\u5316\u7684\u76ee\u7684\u662f\u7b80\u5316\u6d88\u8d39\u8005\u7684\u5f02\u5e38\u5904\u7406\u903b\u8f91\uff0c\u4e0d\u7528\u4f7f\u7528\u5f31\u7c7b\u578b\uff0c\u800c\u662f\u4f7f\u7528\u786e\u5207\u7c7b\u578b\u3002\u53ef\u4ee5\u91c7\u7528\u6ce8\u518c\u5168\u5c40\u7684\u9519\u8bef\u7801\u7c7b\u578b\u3002 \u4e1a\u52a1\u9700\u8981\u901a\u8fc7SPI\u5b9e\u73b0org.apache.servicecomb.swagger.invocation.response.ResponseMetaMapper\u63a5\u53e3\u3002 \u63a5\u53e3\u7684\u6838\u5fc3\u5185\u5bb9\u662f\u4e3a\u6bcf\u4e2a\u9519\u8bef\u7801\u6307\u5b9a\u5e8f\u5217\u5316\u7c7b\u578b\uff1a</p> <pre><code> private final static Map&lt;Integer, ResponseMeta&gt; CODES = new HashMap&lt;&gt;(1);\n\n static {\n ResponseMeta meta = new ResponseMeta();\n meta.setJavaType(SimpleType.constructUnsafe(IllegalStateErrorData.class));\n CODES.put(500, meta);\n }\n\n @Override\n public Map&lt;Integer, ResponseMeta&gt; getMapper() {\n return CODES;\n }\n</code></pre>"},{"location":"general-development/file-download.html","title":"\u6587\u4ef6\u4e0b\u8f7d\u5f00\u53d1\u6307\u5bfc","text":"<p>Java Chassis\u63d0\u4f9b\u4e86\u901a\u7528\u7684 <code>\u6587\u4ef6\u4e0b\u8f7d</code> \u652f\u6301\u3002 \u5982\u679c\u8fd4\u56de\u503c\u7c7b\u578b\u4e3a <code>File</code>\u3001<code>Resource</code>\u3001<code>InputStream</code>\u3001<code>Part</code> \u7b49\uff0c\u5219\u88ab\u8ba4\u4e3a\u662f <code>\u6587\u4ef6\u4e0b\u8f7d</code>\u3002 \u6587\u4ef6MIME\u7c7b\u578b\u548c\u6587\u4ef6\u540d\u53ef\u4ee5\u4f7f\u7528 <code>Part</code> \u7684 API \u6307\u5b9a\u3002</p> <ul> <li>Spring MVC</li> </ul> <pre><code>@GetMapping(path = \"/downloadSpringMVCExample\")\npublic Part downloadSpringMVCExample(String content) throws IOException {\n File file = createTempFile(content);\n return new FilePart(null, file)\n .setDeleteAfterFinished(true)\n .setSubmittedFileName(\"test.bin\")\n .contentType(\"application/octet-stream\");\n}\n</code></pre> <p>\u4e0a\u8ff0\u63a5\u53e3\u4f1a\u8fd4\u56de\u5982\u4e0b\u54cd\u5e94\u5934:</p> <pre><code>Content-Disposition: attachment;filename=test.bin;filename*=utf-8\u2019\u2019test.bin\nContent-Encoding: gzip\nContent-Type: application/octet-stream\nTransfer-Encoding: chunked\n</code></pre> <ul> <li>JAX-RS</li> </ul> <pre><code>@GET\n@Path(\"/downloadSpringMVCExample\")\npublic Part downloadSpringMVCExample(String content) throws IOException {\n File file = createTempFile(content);\n return new FilePart(null, file)\n .setDeleteAfterFinished(true)\n .setSubmittedFileName(\"test.bin\")\n .contentType(\"application/octet-stream\");\n}\n</code></pre> <p>\u4e0a\u8ff0\u63a5\u53e3\u4f1a\u8fd4\u56de\u5982\u4e0b\u54cd\u5e94\u5934:</p> <pre><code>Content-Disposition: attachment;filename=test.bin;filename*=utf-8\u2019\u2019test.bin\nContent-Encoding: gzip\nContent-Type: application/octet-stream\nTransfer-Encoding: chunked\n</code></pre>"},{"location":"general-development/file-download.html#_2","title":"\u670d\u52a1\u63d0\u4f9b\u8005\u5f00\u53d1","text":"<p>\u6587\u4ef6\u4e0b\u8f7d\u670d\u52a1\u7aef\u5b9a\u4e49\u5efa\u8bae\u4f7f\u7528 <code>Part</code>\uff0c \u5b83\u63d0\u4f9b\u4e86\u6700\u4e30\u5bcc\u7684\u529f\u80fd\uff0c\u5305\u62ec\u6307\u5b9a\u6587\u4ef6\u540d\u3001\u6587\u4ef6\u5220\u9664\u7b56\u7565\u4ee5\u53ca\u6307\u5b9aContent-Type\u7b49\u3002 Java Chassis\u4e5f\u63d0\u4f9b\u4e86\u4e0b\u9762\u7684\u4e00\u4e9b\u7c7b\u578b\u652f\u6301\u3002 </p> <ul> <li>File</li> </ul> <p>\u6700\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u63a5\u53e3\u7684\u8fd4\u56de\u53c2\u6570\u58f0\u660e\u4e3a File \u7c7b\u578b\u7684\u53c2\u6570\uff0c \u5373\u53ef\u5b9a\u4e49\u4e00\u4e2a\u4e0b\u8f7d\u63a5\u53e3\u3002 </p> <pre><code>@GetMapping(path = \"/file\")\npublic File file(String name)\n</code></pre> <ul> <li>Resource</li> </ul> <p>\u53ef\u4ee5\u5c06\u63a5\u53e3\u58f0\u660e\u4e3a org.springframework.core.io.Resource\u3002 \u7531\u4e8eresource\u4e0d\u4e00\u5b9a\u8868\u793a\u6587\u4ef6\u4e0b\u8f7d\uff0c\u6240\u4ee5\u9700\u8981\u901a\u8fc7 @ApiResponse \u6807\u8bc6\u8fd9\u662f\u4e00\u4e2a\u6587\u4ef6\u4e0b\u8f7d\u573a\u666f</p> <p>\u4ee5ByteArrayResource\u4e3a\u4f8b\u8bf4\u660e\uff1a</p> <pre><code>@GetMapping(path = \"/resource\")\n@ApiResponses({\n @ApiResponse(code = 200, response = File.class, message = \"\")\n})\npublic Resource resource() {\n return new ByteArrayResource(bytes) {\n @Override\n public String getFilename() {\n return \"resource.txt\";\n }\n };\n}\n</code></pre> <p>\u4e0a\u4f8b\u4e2d\uff0c\u56e0\u4e3aByteArrayResource\u6ca1\u6709\u6587\u4ef6\u540d\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u9700\u8981\u5b9e\u73b0Resource\u7684getFilename\u65b9\u6cd5\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7ResponseEntity\u8fdb\u884c\u5305\u88c5\uff1a</p> <pre><code>@GetMapping(path = \"/resource\")\n@ApiResponses({\n @ApiResponse(code = 200, response = File.class, message = \"\")\n})\npublic ResponseEntity&lt;Resource&gt; resource() {\n return ResponseEntity\n .ok()\n .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE)\n .header(HttpHeaders.CONTENT_DISPOSITION, \"attachment;filename=resource.txt\")\n .body(resource);\n}\n</code></pre> <ul> <li>InputStream</li> </ul> <p>\u4e00\u6837\u7684\uff0c \u4f7f\u7528 InputStream \u9700\u8981 @ApiResponse \u6807\u8bc6\u8fd9\u662f\u4e00\u4e2a\u6587\u4ef6\u4e0b\u8f7d\u573a\u666f</p> <pre><code>@GetMapping(path = \"/inputStream\")\n@ApiResponses({\n @ApiResponse(code = 200, response = File.class, message = \"\"),\n})\npublic ResponseEntity&lt;InputStream&gt; download() throws IOException {\n return ResponseEntity\n .ok()\n .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE)\n .header(HttpHeaders.CONTENT_DISPOSITION, \"attachment;filename=resource.txt\")\n .body(stream);\n}\n</code></pre> <p>\u5728\u4e0b\u8f7d\u5b8c\u6210\u540e\uff0cServiceComb\u4f1a\u81ea\u52a8\u5173\u95edstream\uff0c\u5f00\u53d1\u4eba\u5458\u4e0d\u5fc5\u518d\u5173\u6ce8\u3002</p> <ul> <li>\u6587\u4ef6\u7c7b\u578b\u5224\u5b9a</li> </ul> <p>\u53ea\u8981\u6ca1\u6709\u901a\u8fc7ResponseEntity\u76f4\u63a5\u8bbe\u7f6eHttpHeaders.CONTENT_TYPE\uff0cJava Chassis\u90fd\u4f1a\u5c1d\u8bd5\u901a\u8fc7File\u3001Part\u3001Resource\u4e2d\u7684\u6587\u4ef6\u540d\u540e\u7f00\u8fdb\u884c\u81ea\u52a8\u5224\u5b9a\u3002</p> <p>Java Chassis\u4f7f\u7528java\u7684mime type\u673a\u5236\u8fdb\u884c\u6587\u4ef6\u7c7b\u578b\u5224\u5b9a\uff0c\u5982\u679c\u4e1a\u52a1\u573a\u666f\u4e2d\u7684\u6587\u4ef6\u540e\u7f00\u65e0\u6cd5\u88ab\u8bc6\u522b\uff0cJava Chassis\u4f1a\u9ed8\u8ba4\u5904\u7406\u4e3aapplication/octet-stream</p> <p>\u5982\u679c\u8fd9\u4e0d\u6ee1\u8db3\u8981\u6c42\uff0c\u5047\u8bbe\u6587\u4ef6\u540e\u7f00\u4e3axyz\uff0c\u671f\u671b\u6587\u4ef6\u7c7b\u578b\u4e3aapplication/file-xyz\uff0c\u4ee5\u4e0b\u65b9\u5f0f\u4efb\u9009\u4e00\u79cd\u5747\u53ef\u89e3\u51b3\uff1a</p> <ol> <li>\u901a\u8fc7Java\u7684mime type\u673a\u5236\u6269\u5c55</li> </ol> <p>\u5728META-INF\u76ee\u5f55\u4e0b\uff0c\u521b\u5efamime.types\u6587\u4ef6\uff0c\u5176\u5185\u5bb9\u4e3a\uff1a</p> <pre><code>application/file-xyz xyz\n</code></pre> <pre><code>2. \u5728\u4e1a\u52a1\u4ee3\u7801\u4e2d\u901a\u8fc7Part\u6307\u5b9a\n</code></pre> <pre><code>@GetMapping(path = \"/tempFilePart\")\npublic Part tempFilePart(String content) throws IOException {\nFile file = createTempFile(content);\n\nreturn new FilePart(null, file)\n .setDeleteAfterFinished(true)\n .contentType(\"application/file-xyz\")\n .setSubmittedFileName(\"tempFilePart.txt\");\n}\n\n</code></pre> <pre><code>3. \u5728\u4e1a\u52a1\u4ee3\u7801\u4e2d\u901a\u8fc7ResponseEntity\u6307\u5b9a\n</code></pre> <pre><code>@GetMapping(path = \"/tempFileEntity\")\npublic ResponseEntity&lt;Part&gt; tempFileEntity(String content) throws IOException {\n File file = createTempFile(content);\n\n return ResponseEntity\n .ok()\n .header(HttpHeaders.CONTENT_TYPE, \"application/file-xyz\")\n .header(HttpHeaders.CONTENT_DISPOSITION, \"attachment;filename=tempFileEntity.txt\")\n .body(new FilePart(null, file)\n .setDeleteAfterFinished(true));\n}\n</code></pre> <ul> <li>\u6307\u5b9a\u6587\u4ef6\u540d</li> </ul> <p>\u53ea\u8981\u6ca1\u6709\u901a\u8fc7ResponseEntity\u76f4\u63a5\u8bbe\u7f6eHttpHeaders.CONTENT_DISPOSITION\uff0cJava Chassis\u90fd\u4f1a\u5c1d\u8bd5\u901a\u8fc7File\u3001Part\u3001Resource\u4e2d\u7684\u6587\u4ef6\u540d\u751f\u6210HttpHeaders.CONTENT_DISPOSITION\uff0c\u5047\u8bbe\u6587\u4ef6\u540d\u4e3afile.txt\uff0c\u5219\u751f\u6210\u7684\u6570\u636e\u5982\u4e0b\uff1a</p> <pre><code>Content-Disposition: attachment;filename=file.txt;filename*=utf-8\u2019\u2019file.txt\n</code></pre> <p>\u4e0d\u4ec5\u4ec5\u751f\u6210 <code>filename</code> \uff0c\u8fd8\u751f\u6210\u4e86 <code>filename\\*</code> \uff0c\u8fd9\u662f\u56e0\u4e3a\u5982\u679c\u6587\u4ef6\u540d\u4e2d\u51fa\u73b0\u4e86\u4e2d\u6587\u3001\u7a7a\u683c\uff0c\u5e76\u4e14filename\u6b63\u786e\u5730\u505a\u4e86encode\uff0cie\u3001chrome\u90fd\u6ca1\u6709\u95ee\u9898\uff0c\u4f46\u662ffirefox\u76f4\u63a5\u5c06encode\u540e\u7684\u4e32\u5f53\u4f5c\u6587\u4ef6\u540d\u76f4\u63a5\u4f7f\u7528\u4e86\u3002firefox\u6309\u7167https://tools.ietf.org/html/rtf6266 \uff0c\u53ea\u5bf9 <code>filename\\*</code> \u8fdb\u884c\u89e3\u7801\u3002</p> <p>\u5982\u679c\u4e1a\u52a1\u4ee3\u7801\u4e2d\u76f4\u63a5\u8bbe\u7f6eContent-Disposition\uff0c\u9700\u8981\u81ea\u884c\u5904\u7406\u591a\u6d4f\u89c8\u5668\u652f\u6301\u7684\u95ee\u9898\u3002</p>"},{"location":"general-development/file-download.html#_3","title":"\u670d\u52a1\u6d88\u8d39\u8005\u5f00\u53d1","text":"<p>\u6d88\u8d39\u8005\u7edf\u4e00\u4f7f\u7528 org.apache.servicecomb.foundation.vertx.http.ReadStreamPart \u5904\u7406\u6587\u4ef6\u4e0b\u8f7d\u3002 \u53ef\u4ee5\u4f7f\u7528\u900f\u660e RPC \u65b9\u5f0f\uff0c </p> <pre><code>public interface \u2026\u2026{\n ReadStreamPart download1(\u2026\u2026);\n ReadStreamPart download2(\u2026\u2026);\n}\n</code></pre> <p>\u6216\u8005 RestTemplate</p> <pre><code>ReadStreamPart part = restTemplate.getForObject(url, ReadStreamPart.class);\n</code></pre> <p>ReadStreamPart\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u65b9\u6cd5\uff0c\u5c06\u6570\u636e\u6d41\u4fdd\u5b58\u4e3a\u672c\u5730\u6570\u636e\uff1a</p> <pre><code>org.apache.servicecomb.foundation.vertx.http.ReadStreamPart.saveAsBytes()\norg.apache.servicecomb.foundation.vertx.http.ReadStreamPart.saveAsString()\norg.apache.servicecomb.foundation.vertx.http.ReadStreamPart.saveToFile(String)\norg.apache.servicecomb.foundation.vertx.http.ReadStreamPart.saveToFile(File, OpenOptions)\n</code></pre> <p>\u6ce8\u610f\uff1a</p> <ul> <li>\u5728\u5f97\u5230ReadStreamPart\u5b9e\u4f8b\u65f6\uff0c\u5e76\u6ca1\u6709\u5b8c\u6210\u6587\u4ef6\u5185\u5bb9\u7684\u4e0b\u8f7d\uff0c\u8c03\u7528save\u7cfb\u5217\u65b9\u6cd5\u624d\u5f00\u59cb\u771f\u6b63\u4ece\u7f51\u7edc\u4e0a\u8bfb\u53d6\u6587\u4ef6\u6570\u636e\u3002</li> <li>\u5982\u679c\u4f7f\u7528saveAsBytes\u3001saveAsString\uff0c\u6570\u636e\u662f\u76f4\u63a5\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d\u7684\uff0c\u5982\u679c\u4e0b\u8f7d\u7684\u6587\u4ef6\u5f88\u5927\uff0c\u4f1a\u5bfc\u81f4\u5185\u5b58\u6ea2\u51fa\u3002</li> <li>save\u7cfb\u5217\u65b9\u6cd5\uff0c\u8fd4\u56de\u7684\u90fd\u662fCompletableFuture\u5bf9\u8c61\uff0c \u5982\u679c\u8981\u963b\u585e\u7b49\u5f85\u4e0b\u8f7d\u5b8c\u6210\uff0c\u901a\u8fc7future.get()\u5373\u53ef\uff1b \u5982\u679c\u901a\u8fc7future.whenComplete\u8fdb\u884c\u5f02\u6b65\u56de\u8c03\u5904\u7406\uff0c\u8981\u6ce8\u610f\u56de\u8c03\u662f\u53d1\u751f\u5728\u7f51\u7edc\u7ebf\u7a0b\u4e2d\u7684\uff0c\u6b64\u65f6\u9700\u8981\u9075\u5b88reactive\u7684\u7ebf\u7a0b\u89c4\u5219\u3002</li> </ul>"},{"location":"general-development/file-upload.html","title":"\u6587\u4ef6\u4e0a\u4f20\u5f00\u53d1\u6307\u5bfc","text":"<p>\u5f53 HTTP \u6d88\u606f\u4f53\u662f <code>multipart/form-data</code>\uff0c \u8868\u793a\u6587\u4ef6\u4e0a\u4f20\u3002</p> <pre><code>GET /apps HTTP/1.1\nHost: 127.0.0.1:8080\nAccept-Language: zh\nContent-Type: multipart/form-data; boundary=----boundary-example----\n\n----boundary-example----\nContent-Disposition: form-data; name=\"multiPartParamExample1\"\n\ncontents of multiPartParamExample1\n----boundary-example----\nContent-Disposition: form-data; name=\"multiPartParamExample2\"\n\ncontents of multiPartParamExample2\n----boundary-example----\n</code></pre> <p>multipart/form-data \u4e5f\u53ef\u4ee5\u8868\u793a Form \u53c2\u6570\uff0c \u548c application/x-www-form-urlencoded \u7528\u6cd5\u4e00\u6837\u3002\u4e3a\u4e86\u907f\u514d\u6df7\u6dc6\u548c\u7b80\u6d01\uff0c\u5efa\u8baemultipart/form-data\u4e13\u7528\u4e8e\u6587\u4ef6\u4e0a\u4f20\u573a\u666f\u3002</p>"},{"location":"general-development/file-upload.html#_2","title":"\u670d\u52a1\u63d0\u4f9b\u8005\u5f00\u53d1","text":"<p>\u670d\u52a1\u63d0\u4f9b\u8005\u53ef\u4ee5\u91c7\u7528Spring MVC \u6216\u8005 Jax RS\u5b9a\u4e49\u4e0a\u4f20\u63a5\u53e3\u3002</p> <ul> <li>\u91c7\u7528Spring MVC</li> </ul> <pre><code>@PostMapping(path = \"multiPartSpringMVCExample\", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)\npublic String multiPartSpringMVCExample(@RequestPart(\"multiPartParamExample1\") MultipartFile example1,\n@RequestPart(\"multiPartParamExample2\") MultipartFile example2)\n</code></pre> <p>\u6587\u4ef6\u4e0a\u4f20\u9700\u8981\u901a\u8fc7 @RequestPart \u58f0\u660e\u53c2\u6570\uff0c\u53c2\u6570\u7c7b\u578b\u652f\u6301 servlet \u5b9a\u4e49\u7684 javax.servlet.http.Part \u7c7b\u578b\uff0c\u4e5f\u652f\u6301 org.springframework.web.multipart.MultipartFile \u7c7b\u578b\uff0c\u4e24\u79cd\u6570\u636e\u7c7b\u578b\u529f\u80fd\u662f\u4e00\u81f4\u7684\uff0cMultipartFile \u7684\u5e95 \u5c42\u4e5f\u662fPart\u3002 \u4e24\u79cd\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u6df7\u5408\u4f7f\u7528\uff0c\u6bd4\u5982\u7b2c\u4e00\u4e2a\u53c2\u6570\u662fPart\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662fMultipartFile\u3002 </p> <p>\u9664\u4e86\u901a\u8fc7\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u7684\u65b9\u5f0f\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7List\u6216\u8005\u6570\u7ec4\u7684\u65b9\u5f0f\u58f0\u660e\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6\u3002</p> <pre><code>@PostMapping(path = \"/fileUpload\", produces = MediaType.TEXT_PLAIN_VALUE, \n consumes = MediaType.MULTIPART_FORM_DATA_VALUE)\npublic String fileUpload(@RequestPart(name = \"files\") List&lt;MultipartFile&gt; files)\n\n@PostMapping(path = \"/fileUpload\", produces = MediaType.TEXT_PLAIN_VALUE, \n consumes = MediaType.MULTIPART_FORM_DATA_VALUE)\npublic String fileUpload(@RequestPart(name = \"files\") MultipartFile[] files)\n</code></pre> <p>\u8bf4\u660e\uff1a \u4f7f\u7528 List \u6216\u8005\u6570\u7ec4\uff0c\u5728HTTP\u53c2\u6570\u6620\u5c04\u4e2d\uff0c\u591a\u4e2a\u6587\u4ef6\u5bf9\u5e94\u4e8e\u540c\u540d\u7684 form \u5185\u5bb9\uff0c\u8fd9\u4e0d\u662f\u4e00\u4e2a\u597d\u7684 API \u8bbe\u8ba1\u5b9e\u8df5\u3002\u5efa\u8bae\u975e\u5fc5\u8981\u4e0d\u4f7f\u7528 List \u6216\u8005\u6570\u7ec4\u4f5c\u4e3a\u6587\u4ef6\u4e0a\u4f20\u53c2\u6570\u3002 </p> <p>\u53ef\u4ee5\u901a\u8fc7 <code>@RequestAttribute</code> \u83b7\u53d6\u5176\u4ed6\u989d\u5916\u4fe1\u606f\u3002</p> <pre><code>@PostMapping(path = \"multiPartSpringMVCExample\", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)\npublic String multiPartSpringMVCExample(@RequestPart(\"multiPartParamExample1\") MultipartFile example1,\n@RequestPart(\"multiPartParamExample2\") MultipartFile example2,\n @RequestAttribute(\"message\") String message)\n</code></pre> <p>\u8bf4\u660e\uff1a<code>@RequestAttribute</code> \u8bfb\u53d6 form \u5185\u5bb9\uff0c \u5e76\u5c06 form \u5185\u5bb9\u8f6c\u6362\u4e3a String \u7c7b\u578b\u3002 \u7531\u4e8e <code>multipart/form-data</code> \u7684 Content-Type \u53ef\u80fd\u5b58\u5728\u591a\u6837\u6027\uff0c \u5efa\u8bae\u6587\u4ef6\u4e0a\u4f20\u573a\u666f\u4e0d\u4f7f\u7528 <code>@RequestAttribute</code>\uff0c \u800c\u662f\u4f7f\u7528 <code>@RequestHeader</code> \u4f20\u9012\u989d\u5916\u4fe1\u606f\u3002 </p> <ul> <li>\u91c7\u7528Jax RS</li> </ul> <pre><code>@POST\n@Path(\"multiPartJAXRSExample\")\n@Consumes(MediaType.MULTIPART_FORM_DATA)\npublic String multiPartJAXRSExample(@FormParam(\"multiPartParamExample1\") Part example1,\n@FormParam(\"multiPartParamExample2\") Part example2)\n</code></pre> <p>\u6587\u4ef6\u4e0a\u4f20\u9700\u8981\u901a\u8fc7 @FormParam \u58f0\u660e\u53c2\u6570\uff0c\u53c2\u6570\u7c7b\u578b\u652f\u6301servlet\u5b9a\u4e49\u7684javax.servlet.http.Part\u7c7b\u578b\u3002</p> <p>\u9664\u4e86\u901a\u8fc7\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u7684\u65b9\u5f0f\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7List\u6216\u8005\u6570\u7ec4\u7684\u65b9\u5f0f\u58f0\u660e\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6\u3002</p> <pre><code>@Path(\"/fileUpload\")\n@POST\n@Produces(MediaType.TEXT_PLAIN)\npublic String fileUpload(@FormParam(name = \"files\") List&lt;Part&gt; files)\n\n@Path(\"/fileUpload\")\n@POST\n@Produces(MediaType.TEXT_PLAIN)\npublic String fileUpload(@FormParam(name = \"files\") Part[] files)\n</code></pre> <p>\u8bf4\u660e\uff1a \u4f7f\u7528 List \u6216\u8005\u6570\u7ec4\uff0c\u5728HTTP\u53c2\u6570\u6620\u5c04\u4e2d\uff0c\u591a\u4e2a\u6587\u4ef6\u5bf9\u5e94\u4e8e\u540c\u540d\u7684 form \u5185\u5bb9\u3002 \u5c3d\u7ba1\u5728\u975e\u6d4f\u89c8\u5668\u573a\u666f\uff0c\u4f7f\u7528 List \u6216\u8005\u6570\u7ec4\u4f1a\u5e26\u6765\u4fbf\u5229\uff0c\u4f46\u662f\u5bf9\u4e8e\u6d4f\u89c8\u5668\u4e0a\u4f20\u573a\u666f\u5219\u4e0d\u5229\u4e8e\u7406\u89e3\u3002\u5efa\u8bae\u975e\u5fc5\u8981\u4e0d\u4f7f\u7528 List \u6216\u8005\u6570\u7ec4\u4f5c\u4e3a\u6587\u4ef6\u4e0a\u4f20\u53c2\u6570\u3002</p> <p>\u53ef\u4ee5\u901a\u8fc7@FormParam\u83b7\u53d6\u5176\u4ed6\u989d\u5916\u4fe1\u606f\u3002</p> <pre><code>@POST\n@Path(\"multiPartJAXRSExample\")\n@Consumes(MediaType.MULTIPART_FORM_DATA)\npublic String multiPartJAXRSExample(@FormParam(\"multiPartParamExample1\") Part example1,\n@FormParam(\"multiPartParamExample2\") Part example2,\n @FormParam(\"message\") String message)\n</code></pre> <p>\u8bf4\u660e\uff1a<code>@FormParam</code> \u8bfb\u53d6 form \u5185\u5bb9\uff0c \u5e76\u5c06 form \u5185\u5bb9\u8f6c\u6362\u4e3a String \u7c7b\u578b\u3002 \u7531\u4e8e <code>multipart/form-data</code> \u7684 Content-Type \u53ef\u80fd\u5b58\u5728\u591a\u6837\u6027\uff0c \u5efa\u8bae\u6587\u4ef6\u4e0a\u4f20\u573a\u666f\u4e0d\u4f7f\u7528 <code>@FormParam</code>\uff0c \u800c\u662f\u4f7f\u7528 <code>@RequestHeader</code> \u4f20\u9012\u989d\u5916\u4fe1\u606f\u3002</p> <ul> <li>\u4e1a\u52a1\u5f00\u53d1\u6ce8\u610f\u4e8b\u9879</li> </ul> <p>\u901a\u8fc7MultipartFile\u6216Part\u6253\u5f00\u6d41\u540e\uff0c\u8bb0\u5f97\u5173\u95ed\uff0c\u5426\u5219\u4e0a\u4f20\u7684\u4e34\u65f6\u6587\u4ef6\u4f1a\u65e0\u6cd5\u5220\u9664\uff0c\u5bfc\u81f4\u8d44\u6e90\u6cc4\u9732\u548c\u78c1\u76d8\u7a7a\u95f4\u8017\u5c3d\u3002</p>"},{"location":"general-development/file-upload.html#_3","title":"\u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005","text":"<p>\u53ef\u4ee5\u4f7f\u7528\u900f\u660e RPC </p> <pre><code> interface UploadIntf {\n String upload(File file);\n }\n\n @RpcReference(microserviceName = \"name\", schemaId = \"schema\")\n UploadIntf uploadIntf;\n\n String result = uploadIntf.upload(file);\n</code></pre> <p>\u6216\u8005 RestTemplate \u8fdb\u884c\u6587\u4ef6\u4e0a\u4f20\u3002 </p> <pre><code>Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();\nmap.put(\"file\", new FileSystemResource(\"a file path!\"));\nmap.put(\"param1\", \"test\");\nHttpHeaders headers = new HttpHeaders();\nheaders.setContentType(org.springframework.http.MediaType.MULTIPART_FORM_DATA);\nHttpEntity&lt;Map&lt;String, Object&gt;&gt; entity = new HttpEntity&lt;&gt;(map, headers);\n\nString reseult = template.postForObject(url, entity, String.class);\n</code></pre> <p>\u670d\u52a1\u6d88\u8d39\u8005\u4e0d\u533a\u5206\u670d\u52a1\u63d0\u4f9b\u8005\u662f Spring MVC \u6216\u8005 Jax RS\u3002 \u5728\u4f7f\u7528\u900f\u660e RPC \u6216\u8005 RestTemplate \u7684\u65f6\u5019\uff0c \u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u7c7b\u578b\u4e0e\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u6587\u4ef6\u5bf9\u5e94\uff1a </p> <ul> <li>java.io.File</li> <li>javax.servlet.http.Part</li> <li>java.io.InputStream</li> <li>org.springframework.core.io.Resource</li> </ul> <p>\u4f7f\u7528InputStream\u65f6\uff0c\u56e0\u4e3a\u662f\u6d41\u7684\u65b9\u5f0f\uff0c\u6b64\u65f6\u6ca1\u6709\u5ba2\u6237\u7aef\u6587\u4ef6\u540d\u7684\u6982\u5ff5\uff0c\u670d\u52a1\u63d0\u4f9b\u8005\u83b7\u53d6\u5230\u7684\u6587\u4ef6\u540d\u4e3anull\u3002 \u5982\u679c\u65e2\u8981\u4f7f\u7528\u5185\u5b58\u6570\u636e\uff0c\u53c8\u60f3\u8ba9producer\u53ef\u4ee5\u83b7\u53d6\u5ba2\u6237\u7aef\u6587\u4ef6\u540d\uff0c\u53ef\u4ee5\u4f7f\u7528resource\u7c7b\u578b\uff0c\u7ee7\u627forg.springframework.core.io.ByteArrayResource\uff0c\u4e14\u9700\u8981\u5b9e\u73b0 getFilename \u65b9\u6cd5\u3002</p>"},{"location":"general-development/file-upload.html#_4","title":"\u4f7f\u7528\u6d4f\u89c8\u5668\u4e0a\u4f20\u6587\u4ef6","text":"<p>\u6d4f\u89c8\u5668\u901a\u8fc7Form\u7684\u65b9\u5f0f\u4e0a\u4f20\u6587\u4ef6\uff0c\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684HTML \u548c JS \u793a\u4f8b</p> <pre><code>&lt;form id=\"upload_form\" method=\"POST\"&gt;\n &lt;p&gt;\n File Name: &lt;input type=\"file\" name=\"fileName\"/&gt;\n &lt;/p&gt;\n &lt;p&gt;\n &lt;input type=\"button\" value=\"Upload\" onclick=\"uploadAction()\"&gt;\n &lt;/p&gt;\n&lt;/form&gt;\n</code></pre> <p>\u4e8b\u4ef6\u5904\u7406\uff1a</p> <pre><code>function uploadAction() {\n var formData = new FormData(document.getElementById(\"upload_form\"));\n\n $.ajax({\n type: 'POST',\n url: \"/api/file-service/upload\",\n data: formData,\n processData:false,\n contentType:false,\n success: function (data) {\n console.log(data);\n var error = document.getElementById(\"error\");\n error.textContent=\"Upload Successfully, file id=\" + data;\n error.hidden=false;\n },\n error: function(data) {\n console.log(data);\n var error = document.getElementById(\"error\");\n error.textContent=\"Upload failed\";\n error.hidden=false;\n },\n async: true\n });\n</code></pre>"},{"location":"general-development/file-upload.html#_5","title":"\u914d\u7f6e\u53c2\u6570\u8bf4\u660e","text":"\u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u53d6\u503c\u8303\u56f4 \u542b\u4e49 servicecomb.uploads.directory null \u4e0a\u4f20\u7684\u4e34\u65f6\u6587\u4ef6\u4fdd\u5b58\u5728\u54ea\u4e2a\u76ee\u5f55\uff0c\u9ed8\u8ba4\u503cnull\u8868\u793a\u4e0d\u652f\u6301\u6587\u4ef6\u4e0a\u4f20 servicecomb.uploads.maxSize -1 http body\u7684\u6700\u5927\u5141\u8bb8\u5927\u5c0f\uff0c\u5355\u4f4dbyte\uff0c\u9ed8\u8ba4\u503c-1\u8868\u793a\u65e0\u9650\u5236"},{"location":"general-development/local-develop-test.html","title":"\u672c\u5730\u5f00\u53d1\u548c\u6d4b\u8bd5","text":""},{"location":"general-development/local-develop-test.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u672c\u5c0f\u8282\u4ecb\u7ecd\u5982\u4f55\u5728\u5f00\u53d1\u8005\u672c\u5730\u8fdb\u884c\u6d88\u8d39\u8005/\u63d0\u4f9b\u8005\u5e94\u7528\u7684\u5f00\u53d1\u8c03\u8bd5\u3002\u5f00\u53d1\u670d\u52a1\u63d0\u4f9b\u8005\u8bf7\u53c2\u80033 \u5f00\u53d1\u670d\u52a1\u63d0\u4f9b\u8005\u7ae0\u8282\uff0c\u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005\u8bf7\u53c2\u80034 \u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005\u3002\u670d\u52a1\u63d0\u4f9b\u8005\u548c\u6d88\u8d39\u63d0\u4f9b\u8005\u5747\u9700\u8981\u8fde\u63a5\u5230\u5728\u8fdc\u7a0b\u7684\u670d\u52a1\u4e2d\u5fc3\uff0c\u4e3a\u4e86\u672c\u5730\u5fae\u670d\u52a1\u7684\u5f00\u53d1\u548c\u8c03\u8bd5\uff0c\u672c\u5c0f\u8282\u4ecb\u7ecd\u4e86\u4e24\u79cd\u642d\u5efa\u672c\u5730\u670d\u52a1\u4e2d\u5fc3\u7684\u65b9\u6cd5\u8fdb\u884c\u672c\u5730\u5fae\u670d\u52a1\u8c03\u8bd5\uff1a</p> <ul> <li> <p>\u542f\u52a8\u672c\u5730\u670d\u52a1\u4e2d\u5fc3</p> </li> <li> <p>\u901a\u8fc7local file\u6a21\u62df\u542f\u52a8\u670d\u52a1\u4e2d\u5fc3Mock\u673a\u5236</p> </li> <li> <p>\u901a\u8fc7\u8bbe\u7f6e\u73af\u5883\u4fe1\u606f\u65b9\u4fbf\u672c\u5730\u8c03\u8bd5</p> </li> </ul> <p>\u670d\u52a1\u4e2d\u5fc3\u662f\u5fae\u670d\u52a1\u6846\u67b6\u4e2d\u7684\u91cd\u8981\u7ec4\u4ef6\uff0c\u7528\u4e8e\u670d\u52a1\u5143\u6570\u636e\u4ee5\u53ca\u670d\u52a1\u5b9e\u4f8b\u5143\u6570\u636e\u7684\u7ba1\u7406\u548c\u5904\u7406\u6ce8\u518c\u3001\u53d1\u73b0\u3002\u670d\u52a1\u4e2d\u5fc3\u4e0e\u5fae\u670d\u52a1\u63d0\u4f9b/\u6d88\u8d39\u8005\u7684\u903b\u8f91\u5173\u7cfb\u4e0b\u56fe\u6240\u793a\uff1a </p>"},{"location":"general-development/local-develop-test.html#_2","title":"\u542f\u52a8\u672c\u5730\u670d\u52a1\u4e2d\u5fc3","text":"<ul> <li> <p>\u6b65\u9aa4 1 \u542f\u52a8\u672c\u5730\u670d\u52a1\u4e2d\u5fc3</p> </li> <li> <p>\u4ee5\u53ef\u6267\u884c\u6587\u4ef6\u7684\u65b9\u5f0f\u8fd0\u884c</p> </li> </ul> <ul> <li>Windows</li> <li>Linux</li> </ul> 1. \u4e0b\u8f7d[\u670d\u52a1\u6ce8\u518c\u4e2d\u5fc3\u53ef\u6267\u884c\u6587\u4ef6\u538b\u7f29\u5305](http://apache.org/dyn/closer.cgi/incubator/servicecomb/incubator-servicecomb-service-center/1.0.0-m1/apache-servicecomb-incubating-service-center-1.0.0-m1-windows-amd64.tar.gz) 2. \u89e3\u538b\u7f29\u5230\u5f53\u524d\u6587\u4ef6\u5939 3. \u8fdb\u5165\u89e3\u538b\u7f29\u540e\u7684\u76ee\u5f55\uff0c\u7136\u540e\u53cc\u51fb\u8fd0\u884c**start-service-center.bat**\u6587\u4ef6 1. \u4e0b\u8f7d\u670d\u52a1\u6ce8\u518c\u4e2d\u5fc3\u53ef\u6267\u884c\u6587\u4ef6\u538b\u7f29\u5305\u5e76\u89e3\u538b\u7f29 ```bash wget http://apache.org/dyn/closer.cgi/incubator/servicecomb/incubator-servicecomb-service-center/1.0.0-m1/apache-servicecomb-incubating-service-center-1.0.0-m1-linux-amd64.tar.gz tar xvf apache-servicecomb-incubating-service-center-1.0.0-m1-linux-amd64.tar.gz ``` 2. \u8fd0\u884c\u670d\u52a1\u6ce8\u518c\u4e2d\u5fc3 ```bash bash apache-servicecomb-incubating-service-center-1.0.0-m1-linux-amd64/start-service-center.sh ``` \u6ce8\u610f\uff1a\u524d\u7aef\uff08frontend\uff09\u5728Linux\u73af\u5883\u4e0b\u9ed8\u8ba4\u4f1a\u7ed1\u5b9aipv6\u5730\u5740\uff0c\u5bfc\u81f4\u6d4f\u89c8\u5668\u62a5\u9519\uff0c\u4fee\u590d\u529e\u6cd5\u4e3a\uff1a\u5148\u4fee\u6539conf/app.conf\u4e2d\u7684httpaddr\u4e3a\u5916\u90e8\u53ef\u8fbe\u7f51\u5361ip\uff0c\u4e4b\u540e\u4fee\u6539app/appList/apiList.js\u4e2d`ip : 'http://127.0.0.1'`\u4e3a\u5bf9\u5e94ip\uff0c\u6700\u540e\u91cd\u542fServiceCenter\u5373\u53ef\u3002 <p>\u6ce8\u610f\uff1aWindow\u548cLinux\u7248\u672c\u5747\u53ea\u652f\u630164\u4f4d\u7cfb\u7edf\u3002</p> <ol> <li>\u4ee5Docker\u7684\u65b9\u5f0f\u8fd0\u884c</li> </ol> <p><code>bash docker pull servicecomb/service-center docker run -d -p 30100:30100 servicecomb/service-center:latest</code></p> <ul> <li>\u6b65\u9aa4 2 \u542f\u52a8\u672c\u5730\u670d\u52a1\u4e2d\u5fc3\u540e\uff0c\u5728\u670d\u52a1\u63d0\u4f9b/\u6d88\u8d39\u8005\u7684microservice.yaml\u6587\u4ef6\u4e2d\u914d\u7f6eServerCenter\u7684\u5730\u5740\u548c\u7aef\u53e3\uff0c\u793a\u4f8b\u4ee3\u7801\uff1a</li> </ul> <p><code>yaml servicecomb: service: registry: address: # \u670d\u52a1\u4e2d\u5fc3\u5730\u5740\u53ca\u7aef\u53e3 http://127.0.0.1:30100</code></p> <ul> <li>\u6b65\u9aa4 3 \u5f00\u53d1\u670d\u52a1\u63d0\u4f9b/\u6d88\u8d39\u8005\uff0c\u542f\u52a8\u5fae\u670d\u52a1\u8fdb\u884c\u672c\u5730\u6d4b\u8bd5\u3002</li> </ul> <p>----\u7ed3\u675f</p>"},{"location":"general-development/local-develop-test.html#mock","title":"Mock\u673a\u5236\u542f\u52a8\u670d\u52a1\u4e2d\u5fc3","text":"<p>\u5728\u672c\u8fdb\u7a0b\u5185\u5b58\u4e2d\u6a21\u62df\u4e00\u4e2a\u53ea\u80fd\u672c\u8fdb\u7a0b\u4f7f\u7528\u7684\u670d\u52a1\u4e2d\u5fc3\uff0c\u4e00\u822c\u662f\u5728\u6d4b\u8bd5\u573a\u666f\u4e2d\u4f7f\u7528\u3002 * ### \u8fdb\u7a0b\u5185\u8c03\u7528 \u53ea\u9700\u8981\u5728\u542f\u52a8ServiceComb\u5f15\u64ce\u4e4b\u524d\u58f0\u660e\u4e00\u4e0b\u5373\u53ef\u542f\u7528\uff1a</p> <pre><code>System.setProperty(\"local.registry.file\", \"notExistJustForceLocal\");\n</code></pre> <ul> <li> <p>\u6b65\u9aa4 1 \u65b0\u5efa\u672c\u5730\u670d\u52a1\u4e2d\u5fc3\u5b9a\u4e49\u6587\u4ef6\uff0c\u5047\u8bbe\u540d\u5b57\u4e3aregistry.yaml\uff0c\u5185\u5bb9\u793a\u4f8b\u5982\u4e0b\uff1a</p> </li> </ul> <p><code>yaml localserv: - id: \"100\" version: \"0.0.1\" appid: localservreg schemaIds: - hello instances: - endpoints: - rest://localhost:8080 - highway://localhost:7070</code> * \u6b65\u9aa4 2 consumer\u672c\u5730\u90e8\u7f72\u5951\u7ea6\u6587\u4ef6</p> <p>\u53c2\u8003\uff1a\u5b9a\u4e49\u670d\u52a1\u5951\u7ea6 * \u6b65\u9aa4 3 \u5728consumer main\u51fd\u6570\uff0c\u542f\u52a8ServiceComb\u5f15\u64ce\u4e4b\u524d\u58f0\u660e\uff1a</p> <pre><code>\u3000\u3000System.setProperty(\"local.registry.file\", \"/path/registry.yaml\");\n</code></pre> <p>setProperty\u7b2c\u4e8c\u4e2a\u53c2\u6570\u586b\u5199registry.yaml\u5728\u78c1\u76d8\u4e2d\u7684\u7cfb\u7edf\u7edd\u5bf9\u8def\u5f84\uff0c\u6ce8\u610f\u533a\u5206\u5728\u4e0d\u540c\u7cfb\u7edf\u4e0b\u4f7f\u7528\u5bf9\u5e94\u7684\u8def\u5f84\u5206\u9694\u7b26\u3002</p>"},{"location":"general-development/local-develop-test.html#_3","title":"\u8de8\u8fdb\u7a0b\u8c03\u7528","text":"<p>\u5982\u679c\u90e8\u7f72\u6bd4\u8f83\u7b80\u5355\uff0c\u5e76\u4e14\u90e8\u7f72\u4fe1\u606f\u662f\u9759\u6001\u7684\uff0c\u5373\u4f7f\u6709\u8de8\u8fdb\u7a0b\u8c03\u7528\u4e5f\u53ef\u4ee5\u4f7f\u7528\u672cMock\u673a\u5236 producer\u7aef\u4ecd\u7136\u50cf\u201c\u8fdb\u7a0b\u5185\u8c03\u7528\u201d\u4e00\u6837\u58f0\u660e\u5373\u53ef \u4f46\u662f\uff0c\u56e0\u4e3aMock\u5e76\u4e0d\u80fd\u8de8\u8fdb\u7a0b\u751f\u6548\uff0c\u6240\u4ee5consumer\u7aef\u7684Mock\uff0c\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u672c\u5730\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5728\u91cc\u9762\u63cf\u8ff0\u8c03\u7528\u76ee\u6807\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u5305\u62ec\u540d\u5b57\u3001\u7248\u672c\u3001\u5730\u5740\u3001schema id\u7b49\u7b49\u4fe1\u606f \u540c\u6837\uff0c\u56e0\u4e3aMock\u4e0d\u80fd\u8de8\u8fdb\u7a0b\uff0cconsumer\u4e5f\u65e0\u6cd5\u52a8\u6001\u53d6\u5f97producer\u7684\u5951\u7ea6\u4fe1\u606f\uff0c\u6240\u4ee5\uff0c\u9700\u8981\u5728\u672c\u5730\u63d0\u4f9b\u5951\u7ea6\u6587\u4ef6 \uff08\u8fd9\u4e2a\u573a\u666f\uff0c\u4f7f\u7528Mock\u670d\u52a1\u4e2d\u5fc3\uff0c\u6bd4\u4f7f\u7528standalone\u7684\u670d\u52a1\u4e2d\u5fc3\uff0c\u6210\u672c\u9ad8\u5f97\u591a\u5f97\u591a\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\uff09</p>"},{"location":"general-development/local-develop-test.html#_4","title":"\u901a\u8fc7\u8bbe\u7f6e\u73af\u5883\u4fe1\u606f\u65b9\u4fbf\u672c\u5730\u8c03\u8bd5","text":"<p>java chassis\u5728\u8bbe\u8ba1\u65f6\uff0c\u4e25\u683c\u4f9d\u8d56\u4e8e\u5951\u7ea6\uff0c\u6240\u4ee5\u6b63\u5e38\u6765\u8bf4\u5951\u7ea6\u53d8\u4e86\u5c31\u5fc5\u987b\u8981\u4fee\u6539\u5fae\u670d\u52a1\u7684\u7248\u672c\u3002\u4f46\u662f\u5982\u679c\u5f53\u524d\u8fd8\u662f\u5f00\u53d1\u6a21\u5f0f\uff0c\u90a3\u4e48\u4fee\u6539\u63a5\u53e3\u662f\u5f88\u6b63\u5e38\u7684\u60c5\u51b5\uff0c\u6bcf\u6b21\u90fd\u9700\u8981\u6539\u7248\u672c\u7684\u8bdd\uff0c\u5bf9\u7528\u6237\u6765\u8bf4\u975e\u5e38\u7684\u4e0d\u53cb\u597d\uff0c\u6240\u4ee5\u589e\u52a0\u4e86\u4e00\u4e2a\u73af\u5883\u8bbe\u7f6e\u3002\u5982\u679c\u5fae\u670d\u52a1\u914d\u7f6e\u6210\u5f00\u53d1\u73af\u5883\uff0c\u63a5\u53e3\u4fee\u6539\u4e86\uff08schema\u53d1\u751f\u4e86\u53d8\u5316\uff09\uff0c\u91cd\u542f\u5c31\u53ef\u4ee5\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\uff0c\u800c\u4e0d\u7528\u4fee\u6539\u7248\u672c\u53f7\u3002\u4f46\u662f\u5982\u679c\u6709consumer\u5df2\u7ecf\u8c03\u7528\u4e86\u91cd\u542f\u4e4b\u524d\u7684\u670d\u52a1\uff0c\u90a3\u4e48consumer\u7aef\u9700\u8981\u91cd\u542f\u624d\u80fd\u83b7\u53d6\u6700\u65b0\u7684schema\u3002\u6bd4\u5982A -&gt; B\uff0cB\u63a5\u53e3\u8fdb\u884c\u4e86\u4fee\u6539\u5e76\u4e14\u91cd\u542f\uff0c\u90a3\u4e48A\u8fd9\u4e2a\u65f6\u5019\u8fd8\u662f\u4f7f\u7528B\u8001\u7684schema\uff0c\u8c03\u7528\u53ef\u80fd\u4f1a\u51fa\u9519\uff0c\u4ee5\u514d\u51fa\u73b0\u672a\u77e5\u5f02\u5e38\uff0cA\u4e5f\u9700\u8981\u91cd\u542f\u3002\u6709\u4e09\u79cd\u65b9\u5f0f\u53ef\u4ee5\u8bbe\u7f6e\uff0c\u63a8\u8350\u4f7f\u7528\u65b9\u6cd51 * \u65b9\u6cd51\uff1a\u901a\u8fc7JVM\u542f\u52a8\u53c2\u6570-Dservice_description.environment=development\u8fdb\u884c\u8bbe\u7f6e</p> <ul> <li>\u65b9\u6cd52\uff1a\u901a\u8fc7microservice.yaml\u914d\u7f6e\u6587\u4ef6\u6765\u6307\u5b9a</li> </ul> <p><code>yaml service_description: environment: development</code></p> <ul> <li>\u65b9\u6cd53\uff1a\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u6765\u6307\u5b9a\uff08\u4ec5\u9650\u4e8eWindows\u7cfb\u7edf\uff09\uff0c\u6bd4\u5982\u5728Eclipse\u4e0b\u9762\u8fdb\u884c\u5982\u4e0b\u8bbe\u7f6e </li> </ul>"},{"location":"general-development/metrics.html","title":"\u5e94\u7528\u6027\u80fd\u76d1\u63a7\uff08metrics\uff09","text":"<p>\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u901a\u8fc7\u5468\u671f\u6027\u7684\u7edf\u8ba1\u6570\u636e\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u5206\u6790\u4e1a\u52a1\u6027\u80fd\u74f6\u9888\uff0c\u5728\u6027\u80fd\u4f18\u5316\u3001\u6545\u969c\u5b9a\u4f4d\u7684\u65f6\u5019\u975e\u5e38\u6709\u5e2e\u52a9\u3002\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u7684\u6307\u6807\u5305\u62ec \u8bf7\u6c42\u5404\u4e2a\u73af\u8282\u7684\u65f6\u5ef6\u3001\u7ebf\u7a0b\u6c60\u4f7f\u7528\u60c5\u51b5\u3001\u8fde\u63a5\u6c60\u4f7f\u7528\u60c5\u51b5\u3001CPU\u548c\u7f51\u7edc\u4f7f\u7528\u60c5\u51b5\u7b49\u3002</p> <p>\u7edf\u8ba1\u6570\u636e\u662f\u4e00\u4e2a\u5468\u671f\u6027\u65f6\u6548\u6570\u636e\uff0c\u53ea\u5728\u7edf\u8ba1\u5468\u671f\u5185\u5177\u6709\u610f\u4e49\u3002\u53ef\u4ee5\u9009\u62e9\u901a\u8fc7 <code>REST</code> \u63a5\u53e3\u67e5\u8be2\u5b9e\u65f6\u7684\u7edf\u8ba1\u6570\u636e\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u65e5\u5fd7\u5f00\u5173\uff0c\u5c06 \u7edf\u8ba1\u6570\u636e\u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6\u91cc\u9762\uff0c\u5e2e\u52a9\u5206\u6790\u6027\u80fd\u95ee\u9898\u3002</p>"},{"location":"general-development/metrics.html#_1","title":"\u4f7f\u7528\u65b9\u6cd5","text":"<p>\u4f7f\u7528\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u975e\u5e38\u7b80\u5355\uff0c \u53ea\u9700\u8981\u5728\u5e94\u7528\u4e2d\u5305\u542b\u76f8\u5173\u7684\u4f9d\u8d56\u5305\uff0c\u901a\u8fc7\u914d\u7f6e\u9879\u5f00\u542f\u548c\u5173\u95ed\u76f8\u5173\u529f\u80fd\u3002 </p> <ol> <li>\u5f00\u542f\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u529f\u80fd\uff0c \u9700\u8981\u5f15\u5165\u4e0b\u9762\u7684\u4f9d\u8d56\uff1a<pre><code>```\n&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;metrics-core&lt;/artifactId&gt;\n&lt;/dependency&gt;\n```\n</code></pre> </li> </ol> <p>\u901a\u8fc7\u5728 <code>microservice.yaml</code> \u4e2d\u589e\u52a0\u4e0b\u9762\u7684\u914d\u7f6e\u9879\uff0c\u5c31\u53ef\u4ee5\u5c06\u6027\u80fd\u7edf\u8ba1\u6570\u636e\u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6\u4e2d\u3002</p> <pre><code> ```\n servicecomb:\n metrics:\n window_time: 60000\n invocation:\n latencyDistribution: 0,1,10,100,1000\n Consumer.invocation.slow:\n enabled: true\n msTime: 1000\n Provider.invocation.slow:\n enabled: true\n msTime: 1000\n publisher.defaultLog:\n enabled: true\n endpoints.client.detail.enabled: true\n ```\n</code></pre> <p>\u4e0a\u8ff0\u914d\u7f6e\u5f00\u542f\u4e86\u6162\u8c03\u7528\u68c0\u6d4b\uff0c\u5982\u679c\u5b58\u5728\u6162\u8c03\u7528\uff0c\u5219\u4f1a\u7acb\u5373\u8f93\u51fa\u76f8\u5e94\u65e5\u5fd7\uff1a</p> <pre><code> ```\n 2019-04-02 23:01:09,103\\[WARN]\\[pool-7-thread-74]\\[5ca37935c00ff2c7-350076] - slow(40 ms) invocation, CONSUMER highway perf1.impl.syncQuery\n http method: GET\n url : /v1/syncQuery/{id}/\n server : highway://192.168.0.152:7070?login=true\n status code: 200\n total : 50.760 ms\n prepare : 0.0 ms\n handlers request : 0.0 ms\n client filters request : 0.0 ms\n send request : 0.5 ms\n get connection : 0.0 ms\n write to buf : 0.5 ms\n wait response : 50.727 ms\n wake consumer : 0.23 ms\n client filters response: 0.2 ms\n handlers response : 0.0 ms (SlowInvocationLogger.java:121)\n ```\n</code></pre> <p>\u5176\u4e2d 5ca37935c00ff2c7-350076 \u662f <code>${traceId}-${invocationId}</code> \u7684\u7ed3\u6784\uff0c\u5728log4j2 \u6216 logback \u7684\u8f93\u51fa\u683c\u5f0f\u4e2d\u901a\u8fc7 %marker \u5f15\u7528\u3002</p> <p>\u4e5f\u53ef\u4ee5\u901a\u8fc7 <code>REST</code> \u63a5\u53e3\u67e5\u8be2\u6027\u80fd\u7edf\u6570\u636e\u3002\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95eehttp://ip:port/metrics \u5373\u53ef\uff0c\u5c06\u4f1a\u5f97\u5230\u7c7b\u4f3c\u4e0b\u9762\u683c\u5f0f\u7684json\u6570\u636e\uff1a</p> <pre><code> ```\n {\n \"servicecomb.vertx.endpoints(address=192.168.0.124:7070,statistic=connectCount,type=client)\": 0.0,\n \"servicecomb.vertx.endpoints(address=192.168.0.124:7070,statistic=disconnectCount,type=client)\": 0.0,\n \"servicecomb.vertx.endpoints(address=192.168.0.124:7070,statistic=connections,type=client)\": 1.0,\n \"servicecomb.vertx.endpoints(address=192.168.0.124:7070,statistic=bytesRead,type=client)\": 508011.0,\n \"servicecomb.vertx.endpoints(address=192.168.0.124:7070,statistic=bytesWritten,type=client)\": 542163.0,\n \"servicecomb.vertx.endpoints(address=192.168.0.124:7070,statistic=queueCount,type=client)\": 0.0,\n\n \"servicecomb.vertx.endpoints(address=0.0.0.0:7070,statistic=connectCount,type=server)\": 0.0,\n \"servicecomb.vertx.endpoints(address=0.0.0.0:7070,statistic=disconnectCount,type=server)\": 0.0,\n \"servicecomb.vertx.endpoints(address=0.0.0.0:7070,statistic=connections,type=server)\": 1.0,\n \"servicecomb.vertx.endpoints(address=0.0.0.0:7070,statistic=bytesRead,type=server)\": 542163.0\n ... ...\n }\n ```\n</code></pre>"},{"location":"general-development/metrics.html#prometheus","title":"\u96c6\u6210Prometheus","text":"<p>Prometheus (\u666e\u7f57\u7c73\u4fee\u65af)\u662f\u4e00\u4e2a\u540d\u5b57\u975e\u5e38\u9177\u7684\u5f00\u6e90\u76d1\u63a7\u7cfb\u7edf\u3002</p> <p>\u5b83\u652f\u6301\u591a\u7ef4\u5ea6\u7684\u6307\u6807\u6570\u636e\u6a21\u578b\uff0c\u670d\u52a1\u7aef\u901a\u8fc7HTTP\u534f\u8bae\u5b9a\u65f6\u62c9\u53d6\u6570\u636e\u540e\uff0c\u901a\u8fc7\u7075\u6d3b\u7684\u67e5\u8be2\u8bed\u8a00\uff0c\u5b9e\u73b0\u76d1\u63a7\u7684\u76ee\u7684\u3002</p> <p>servicecomb\u7684\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u529f\u80fd\u652f\u6301\u5bf9\u63a5Prometheus,\u9996\u5148\u9700\u8981\u5728\u60a8\u7684\u4e1a\u52a1\u9879\u76ee\u4e2d\u52a0\u5165\u5982\u4e0b\u4f9d\u8d56:</p> <pre><code> ```\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;metrics-prometheus&lt;/artifactId&gt;\n &lt;/dependency&gt;\n ```\n</code></pre> <p>\u7136\u540e\u5728 microservice.yaml \u4e2d\u589e\u52a0\u4e0b\u9762\u7684\u914d\u7f6e\u9879:</p> <pre><code> ```\n servicecomb:\n metrics:\n prometheus:\n address: ${ip}:${port}\n ```\n</code></pre> <p>\u8be5\u914d\u7f6e\u9879\u662f\u8bbe\u7f6e\u666e\u7f57\u7c73\u4fee\u65af\u6846\u67b6\u76d1\u542c\u7684\u7aef\u53e3,\u60a8\u53ea\u9700\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee\u5bf9\u5e94\u7684ip\u5730\u5740\u52a0\u8be5\u7aef\u53e3\u5373http://ip:port/metrics \u5c31\u53ef\u4ee5\u83b7\u5f97\u5982\u4e0b\u683c\u5f0f\u7684\u76d1\u63a7\u6570\u636e:</p> <pre><code> ```\n # HELP ServiceComb_Metrics ServiceComb Metrics\n # TYPE ServiceComb_Metrics untyped\n threadpool_rejectedCount{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} 0.0\n threadpool_rejectedCount{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} 0.0\n threadpool_taskCount{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} 0.0\n threadpool_currentThreadsBusy{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} NaN\n threadpool_taskCount{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} 0.0\n threadpool_currentThreadsBusy{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} NaN\n threadpool_poolSize{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} NaN\n threadpool_poolSize{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} NaN\n threadpool_completedTaskCount{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"connectCount\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"disconnectCount\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"connections\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"bytesRead\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"bytesWritten\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"requests\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"latency\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:7070\",statistic=\"rejectByConnectionLimit\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"connectCount\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"disconnectCount\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"connections\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"bytesRead\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"bytesWritten\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"requests\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"latency\",type=\"server\",} 0.0\n servicecomb_vertx_endpoints{appId=\"springmvctest\",address=\"0.0.0.0:8080\",statistic=\"rejectByConnectionLimit\",type=\"server\",} 0.0\n threadpool_completedTaskCount{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} 0.0\n threadpool_maxThreads{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} NaN\n threadpool_maxThreads{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} NaN\n threadpool_queueSize{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} NaN\n threadpool_queueSize{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} NaN\n threadpool_corePoolSize{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group0\",} NaN\n threadpool_corePoolSize{appId=\"springmvctest\",id=\"cse.executor.groupThreadPool-group1\",} NaN\n ```\n</code></pre> <p>\u6ce8:\u9ed8\u8ba4\u7aef\u53e3\u662f9696\uff0c\u60a8\u4e5f\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u8981\u6c42\u8fdb\u884c\u4fee\u6539\u3002</p>"},{"location":"general-development/metrics.html#_2","title":"\u914d\u7f6e\u8bf4\u660e","text":"\u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 servicecomb.metrics.window_time 60000 \u7edf\u8ba1\u5468\u671f\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2TPS\u3001\u65f6\u5ef6\u7b49\u7b49\u5468\u671f\u6027\u7684\u6570\u636e\uff0c\u6bcf\u5468\u671f\u66f4\u65b0\u4e00\u6b21\uff0c\u5728\u5468\u671f\u5185\u83b7\u53d6\u5230\u7684\u503c\uff0c\u5b9e\u9645\u662f\u4e0a\u4e00\u5468\u671f\u7684\u503c servicecomb.metrics.invocation.latencyDistribution \u65f6\u5ef6\u5206\u5e03\u65f6\u95f4\u6bb5\u5b9a\u4e49\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\u4f8b\u5982\uff1a0,1,10,100,1000\u8868\u793a\u5b9a\u4e49\u4e86\u4e0b\u5217\u65f6\u5ef6\u6bb5[0, 1),[1, 10),[10, 100),[100, 1000),[1000, ) servicecomb.metrics.Consumer.invocation.slow.enabled false \u662f\u5426\u5f00\u542fConsumer\u7aef\u7684\u6162\u8c03\u7528\u68c0\u6d4b\u901a\u8fc7\u589e\u52a0\u540e\u7f00.${service}.${schema}.${operation}\uff0c\u53ef\u4ee5\u652f\u63014\u7ea7\u4f18\u5148\u7ea7\u5b9a\u4e49 servicecomb.metrics.Consumer.invocation.slow.msTime 1000 \u65f6\u5ef6\u8d85\u8fc7\u914d\u7f6e\u503c\uff0c\u5219\u4f1a\u7acb\u5373\u8f93\u51fa\u65e5\u5fd7\uff0c\u8bb0\u5f55\u672c\u6b21\u8c03\u7528\u7684stage\u8017\u65f6\u4fe1\u606f\u901a\u8fc7\u589e\u52a0\u540e\u7f00.${service}.${schema}.${operation}\uff0c\u53ef\u4ee5\u652f\u63014\u7ea7\u4f18\u5148\u7ea7\u5b9a\u4e49 servicecomb.metrics.Provider.invocation.slow.enabled false \u662f\u5426\u5f00\u542fProvide\u7aef\u7684\u6162\u8c03\u7528\u68c0\u6d4b\u901a\u8fc7\u589e\u52a0\u540e\u7f00.${service}.${schema}.${operation}\uff0c\u53ef\u4ee5\u652f\u63014\u7ea7\u4f18\u5148\u7ea7\u5b9a\u4e49 servicecomb.metrics.Provider.invocation.slow.msTime 1000 \u65f6\u5ef6\u8d85\u8fc7\u914d\u7f6e\u503c\uff0c\u5219\u4f1a\u7acb\u5373\u8f93\u51fa\u65e5\u5fd7\uff0c\u8bb0\u5f55\u672c\u6b21\u8c03\u7528\u7684stage\u8017\u65f6\u4fe1\u606f\u901a\u8fc7\u589e\u52a0\u540e\u7f00.${service}.${schema}.${operation}\uff0c\u53ef\u4ee5\u652f\u63014\u7ea7\u4f18\u5148\u7ea7\u5b9a\u4e49 servicecomb.metrics.prometheus.address 0.0.0.0:9696 prometheus\u76d1\u542c\u5730\u5740 servicecomb.metrics.publisher.defaultLog.enabled false \u662f\u5426\u8f93\u51fa\u9ed8\u8ba4\u7684\u7edf\u8ba1\u65e5\u5fd7 servicecomb.metrics.publisher.defaultLog.endpoints.client.detail.enabled false \u662f\u5426\u8f93\u51fa\u6bcf\u4e00\u6761client endpoint\u7edf\u8ba1\u65e5\u5fd7\uff0c\u56e0\u4e3a\u8ddf\u76ee\u6807\u7684ip:port\u6570\u6709\u5173\uff0c\u53ef\u80fd\u4f1a\u6709\u5f88\u591a\u6570\u636e\uff0c\u6240\u4ee5\u9ed8\u8ba4\u4e0d\u8f93\u51fa"},{"location":"general-development/metrics.html#_3","title":"\u7edf\u8ba1\u6307\u6807\u542b\u4e49\u8bf4\u660e","text":"<ul> <li>CPU \u7edf\u8ba1\u4fe1\u606f</li> </ul> Name Tag keys Tag values \u542b\u4e49 os type cpu \u5f53\u524d\u5468\u671f\u5185\u7cfb\u7edfCPU\u4f7f\u7528\u7387\uff0cSolaris\u6a21\u5f0f processCpu \u5f53\u524d\u5468\u671f\u5185\u5fae\u670d\u52a1\u8fdb\u7a0bCPU\u4f7f\u7528\u7387\uff0cIRIX\u6a21\u5f0f processCpu\u9664\u4ee5cpu\u8fd1\u4f3c\u7b49\u4e8e\u7cfb\u7edfCPU\u6570 <ul> <li>\u7f51\u7edc\u7edf\u8ba1\u4fe1\u606f</li> </ul> Name Tag keys Tag values \u542b\u4e49 os type net statistic send \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u53d1\u9001\u7684\u5b57\u8282\u6570(Bps) receive \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u63a5\u6536\u7684\u5b57\u8282\u6570(Bps) sendPackets \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u53d1\u9001\u7684\u5305\u6570(pps) receivePackets \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u63a5\u6536\u7684\u5305\u6570(pps) interface \u7f51\u5361\u8bbe\u5907\u540d <ul> <li>vertx client endpoints \u7edf\u8ba1\u4fe1\u606f </li> </ul> Name Tag keys Tag values \u542b\u4e49 servicecomb.vertx.endpoints type client address ${ip}:${port} \u670d\u52a1\u7aef\u7684ip:port statistic connectCount \u5f53\u524d\u5468\u671f\u5185\u5171\u53d1\u8d77\u591a\u5c11\u6b21\u8fde\u63a5 disconnectCount \u5f53\u524d\u5468\u671f\u5185\u65ad\u8fde\u7684\u6b21\u6570 queueCount http\u8fde\u63a5\u6c60\u4e2d\u6b63\u5728\u7b49\u5f85\u83b7\u53d6\u8fde\u63a5\u7684\u8bf7\u6c42\u6570 connections \u5f53\u524d\u65f6\u523b\u7684\u8fde\u63a5\u6570 bytesRead \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u63a5\u6536\u7684\u5b57\u8282\u6570(Bps) \u4e1a\u52a1\u5c42\u7684\u7edf\u8ba1\uff0c\u76f8\u5bf9\u4ece\u7f51\u5361\u83b7\u53d6\u7684\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u6570\u636e\u4e0d\u5305\u62ec\u5305\u5934\u7684\u5927\u5c0f \u5bf9\u4e8ehttp\u6d88\u606f\uff0c\u4e0d\u5305\u62echttp header\u5927\u5c0f bytesWritten \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u53d1\u9001\u7684\u5b57\u8282\u6570(Bps) \u4e1a\u52a1\u5c42\u7684\u7edf\u8ba1\uff0c\u76f8\u5bf9\u4ece\u7f51\u5361\u83b7\u53d6\u7684\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u6570\u636e\u4e0d\u5305\u62ec\u5305\u5934\u7684\u5927\u5c0f \u5bf9\u4e8ehttp\u6d88\u606f\uff0c\u4e0d\u5305\u62echttp header\u5927\u5c0f <ul> <li>vertx server endpoints \u7edf\u8ba1\u4fe1\u606f</li> </ul> Name Tag keys Tag values \u542b\u4e49 servicecomb.vertx.endpoints type server address ${ip}:${port} \u76d1\u542c\u7684ip:port statistic connectCount \u5f53\u524d\u5468\u671f\u5185\u5171\u63a5\u5165\u591a\u5c11\u6b21\u8fde\u63a5 disconnectCount \u5f53\u524d\u5468\u671f\u5185\u65ad\u8fde\u7684\u6b21\u6570 rejectByConnectionLimit \u5f53\u524d\u5468\u671f\u5185\u56e0\u8d85\u51fa\u8fde\u63a5\u6570\u9650\u5236\u800c\u4e3b\u52a8\u65ad\u8fde\u7684\u6b21\u6570 connections \u5f53\u524d\u65f6\u523b\u7684\u8fde\u63a5\u6570 bytesRead \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u53d1\u9001\u7684\u5b57\u8282\u6570(Bps) \u4e1a\u52a1\u5c42\u7684\u7edf\u8ba1\uff0c\u76f8\u5bf9\u4ece\u7f51\u5361\u83b7\u53d6\u7684\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u6570\u636e\u4e0d\u5305\u62ec\u5305\u5934\u7684\u5927\u5c0f \u5bf9\u4e8ehttp\u6d88\u606f\uff0c\u4e0d\u5305\u62echttp header\u5927\u5c0f bytesWritten \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u63a5\u6536\u7684\u5b57\u8282\u6570(Bps) \u4e1a\u52a1\u5c42\u7684\u7edf\u8ba1\uff0c\u76f8\u5bf9\u4ece\u7f51\u5361\u83b7\u53d6\u7684\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u6570\u636e\u4e0d\u5305\u62ec\u5305\u5934\u7684\u5927\u5c0f \u5bf9\u4e8ehttp\u6d88\u606f\uff0c\u4e0d\u5305\u62echttp header\u5927\u5c0f <ul> <li>\u65f6\u5ef6\u5206\u5e03\u6982\u89c8</li> </ul> Name Tag keys Tag values \u542b\u4e49 servicecomb.invocation role CONSUMER\u3001PRODUCER\u3001EDGE \u662fCONSUMER\u3001PRODUCER\u8fd8\u662fEDGE\u7aef\u7684\u7edf\u8ba1 operation ${microserviceName}.${schemaId}.${operationName} \u8c03\u7528\u7684\u65b9\u6cd5\u540d transport highway\u6216rest \u8c03\u7528\u662f\u5728\u54ea\u4e2a\u4f20\u8f93\u901a\u9053\u4e0a\u53d1\u751f\u7684 status http status code type latencyDistribution \u8c03\u7528\u65f6\u5ef6\u5206\u5e03 scope [${min}, ${max}) \u5f53\u524d\u5468\u671f\u5185\u8c03\u7528\u65f6\u5ef6\u5927\u4e8e\u7b49\u4e8emin\uff0c\u5c0f\u4e8emax\u7684\u6b21\u6570 [${min},)\u8868\u793amax\u4e3a\u65e0\u9650\u5927 <ul> <li>consumer \u8be6\u7ec6\u65f6\u5ef6\u5206\u5e03</li> </ul> Name Tag keys Tag values \u542b\u4e49 servicecomb.invocation role CONSUMER CONSUMER\u7aef\u7684\u7edf\u8ba1 operation ${microserviceName}.${schemaId}.${operationName} \u8c03\u7528\u7684\u65b9\u6cd5\u540d transport highway\u6216rest \u8c03\u7528\u662f\u5728\u54ea\u4e2a\u4f20\u8f93\u901a\u9053\u4e0a\u53d1\u751f\u7684 status http status code type stage stage\u65f6\u5ef6 stage total \u5168\u6d41\u7a0b prepare \u521d\u59cb\u5316 handlers_request handler\u94fe\u8bf7\u6c42\u6d41\u7a0b client_filters_request http client filter\u94fe\u8bf7\u6c42\u6d41\u7a0b \u53ea\u6709\u8d70rest transport\u624d\u6709\u672c\u9636\u6bb5 consumer_send_request \u53d1\u9001\u8bf7\u6c42\u9636\u6bb5\uff0c\u5305\u62ecconsumer_get_connection\u548cconsumer_write_to_buf consumer_get_connection \u4ece\u8fde\u63a5\u6c60\u83b7\u53d6\u8fde\u63a5 consumer_write_to_buf \u5411\u7f51\u7edc\u7f13\u51b2\u533a\u5199\u6570\u636e consumer_wait_response \u7b49\u5f85\u670d\u52a1\u7aef\u5e94\u7b54 consumer_wake_consumer \u540c\u6b65\u6d41\u7a0b\u4e2d\uff0c\u6536\u5230\u5e94\u7b54\u540e\uff0c\u4ece\u5524\u9192\u7b49\u5f85\u7ebf\u7a0b\uff0c\u5230\u7b49\u5f85\u7ebf\u7a0b\u5f00\u59cb\u5904\u7406\u5e94\u7b54\u7684\u8017\u65f6 client_filters_response http client filter\u94fe\u5e94\u7b54\u6d41\u7a0b handlers_response handler\u94fe\u5e94\u7b54\u6d41\u7a0b statistic count \u5e73\u5747\u6bcf\u79d2\u8c03\u7528\u6b21\u6570\uff0c\u5373TPS count=\u7edf\u8ba1\u5468\u671f\u5185\u7684\u8c03\u7528\u6b21\u6570/\u5468\u671f\uff08\u79d2\uff09 totalTime \u5355\u4f4d\u4e3a\u79d2 totalTime=\u5f53\u524d\u5468\u671f\u5185\u7684\u8c03\u7528\u8017\u65f6\u603b\u65f6\u957f/\u5468\u671f\uff08\u79d2\uff09 totalTime\u9664\u4ee5count\u5373\u53ef\u5f97\u5230\u5e73\u5747\u65f6\u5ef6 max \u5355\u4f4d\u4e3a\u79d2 \u5f53\u524d\u5468\u671f\u5185\u6700\u5927\u8017\u65f6 <ul> <li>provider \u8be6\u7ec6\u65f6\u5ef6\u5206\u5e03</li> </ul> Name Tag keys Tag values \u542b\u4e49 servicecomb.invocation role PRODUCER PRODUCER\u7aef\u7684\u7edf\u8ba1 operation ${microserviceName}.${schemaId}.${operationName} \u8c03\u7528\u7684\u65b9\u6cd5\u540d transport highway\u6216rest \u8c03\u7528\u662f\u5728\u54ea\u4e2a\u4f20\u8f93\u901a\u9053\u4e0a\u53d1\u751f\u7684 status http status code type stage stage\u65f6\u5ef6 stage total \u5168\u6d41\u7a0b prepare \u521d\u59cb\u5316 queue \u4ec5\u5728\u4f7f\u7528\u7ebf\u7a0b\u6c60\u65f6\u6709\u610f\u4e49 \u8868\u793a\u8c03\u7528\u5728\u7ebf\u7a0b\u6c60\u4e2d\u6392\u961f\u7684\u65f6\u957f server_filters_request http server filter\u94fe\u8bf7\u6c42\u6d41\u7a0b \u53ea\u6709\u8d70rest transport\u624d\u6709\u672c\u9636\u6bb5 handlers_request handler\u94fe\u8bf7\u6c42\u6d41\u7a0b execution \u4e1a\u52a1\u65b9\u6cd5 handlers_response handler\u94fe\u5e94\u7b54\u6d41\u7a0b server_filters_response http server filter\u94fe\u5e94\u7b54\u6d41\u7a0b producer_send_response \u53d1\u9001\u5e94\u7b54 statistic count \u5e73\u5747\u6bcf\u79d2\u8c03\u7528\u6b21\u6570\uff0c\u5373TPS count=\u7edf\u8ba1\u5468\u671f\u5185\u7684\u8c03\u7528\u6b21\u6570/\u5468\u671f\uff08\u79d2\uff09 totalTime \u5355\u4f4d\u4e3a\u79d2 totalTime=\u5f53\u524d\u5468\u671f\u5185\u7684\u8c03\u7528\u8017\u65f6\u603b\u65f6\u957f/\u5468\u671f\uff08\u79d2\uff09 totalTime\u9664\u4ee5count\u5373\u53ef\u5f97\u5230\u5e73\u5747\u65f6\u5ef6 max \u5355\u4f4d\u4e3a\u79d2 \u5f53\u524d\u5468\u671f\u5185\u6700\u5927\u8017\u65f6 <ul> <li>edge service \u8be6\u7ec6\u65f6\u5ef6\u5206\u5e03</li> </ul> Name Tag keys Tag values \u542b\u4e49 servicecomb.invocation role EDGE EDGE\u7684\u7edf\u8ba1 operation ${microserviceName}.${schemaId}.${operationName} \u8c03\u7528\u7684\u65b9\u6cd5\u540d transport highway\u6216rest \u8c03\u7528\u662f\u5728\u54ea\u4e2a\u4f20\u8f93\u901a\u9053\u4e0a\u53d1\u751f\u7684 status http status code type stage stage\u65f6\u5ef6 stage total \u5168\u6d41\u7a0b prepare \u521d\u59cb\u5316 queue \u4ec5\u5728\u4f7f\u7528\u7ebf\u7a0b\u6c60\u65f6\u6709\u610f\u4e49 \u8868\u793a\u8c03\u7528\u5728\u7ebf\u7a0b\u6c60\u4e2d\u6392\u961f\u7684\u65f6\u957f server_filters_request http server filter\u94fe\u8bf7\u6c42\u6d41\u7a0b handlers_request handler\u94fe\u8bf7\u6c42\u6d41\u7a0b client_filters_request http client filter\u94fe\u8bf7\u6c42\u6d41\u7a0b consumer_send_request \u53d1\u9001\u8bf7\u6c42\u9636\u6bb5\uff0c\u5305\u62ecconsumer_get_connection\u548cconsumer_write_to_buf consumer_get_connection \u4ece\u8fde\u63a5\u6c60\u83b7\u53d6\u8fde\u63a5 consumer_write_to_buf \u5411\u7f51\u7edc\u7f13\u51b2\u533a\u5199\u6570\u636e consumer_wait_response \u7b49\u5f85\u670d\u52a1\u7aef\u5e94\u7b54 consumer_wake_consumer \u540c\u6b65\u6d41\u7a0b\u4e2d\uff0c\u6536\u5230\u5e94\u7b54\u540e\uff0c\u4ece\u5524\u9192\u7b49\u5f85\u7ebf\u7a0b\uff0c\u5230\u7b49\u5f85\u7ebf\u7a0b\u5f00\u59cb\u5904\u7406\u5e94\u7b54\u7684\u8017\u65f6 client_filters_response http client filter\u94fe\u5e94\u7b54\u6d41\u7a0b handlers_response handler\u94fe\u5e94\u7b54\u6d41\u7a0b server_filters_response http server filter\u94fe\u5e94\u7b54\u6d41\u7a0b producer_send_response \u53d1\u9001\u5e94\u7b54 statistic count \u5e73\u5747\u6bcf\u79d2\u8c03\u7528\u6b21\u6570\uff0c\u5373TPS count=\u7edf\u8ba1\u5468\u671f\u5185\u7684\u8c03\u7528\u6b21\u6570/\u5468\u671f\uff08\u79d2\uff09 totalTime \u5355\u4f4d\u4e3a\u79d2 totalTime=\u5f53\u524d\u5468\u671f\u5185\u7684\u8c03\u7528\u8017\u65f6\u603b\u65f6\u957f/\u5468\u671f\uff08\u79d2\uff09 totalTime\u9664\u4ee5count\u5373\u53ef\u5f97\u5230\u5e73\u5747\u65f6\u5ef6 max \u5355\u4f4d\u4e3a\u79d2 \u5f53\u524d\u5468\u671f\u5185\u6700\u5927\u8017\u65f6 <ul> <li>\u7ebf\u7a0b\u6c60\u4fe1\u606f</li> </ul> Name Tag keys Tag values \u542b\u4e49 threadpool.corePoolSize id ${threadPoolName} \u6700\u5c0f\u7ebf\u7a0b\u6570 threadpool.maxThreads \u6700\u5927\u5141\u8bb8\u7684\u7ebf\u7a0b\u6570 threadpool.poolSize \u5f53\u524d\u5b9e\u9645\u7ebf\u7a0b\u6570 threadpool.currentThreadsBusy \u5f53\u524d\u7684\u6d3b\u52a8\u7ebf\u7a0b\u6570\uff0c\u5373\u5f53\u524d\u6b63\u5728\u6267\u884c\u7684\u4efb\u52a1\u6570 threadpool.queueSize \u5f53\u524d\u6b63\u5728\u6392\u961f\u7684\u4efb\u52a1\u6570 threadpool.rejectedCount \u5f53\u524d\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u88ab\u62d2\u7edd\u7684\u4efb\u52a1\u6570 threadpool.taskCount \u7edf\u8ba1\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u63d0\u4ea4\u7684\u4efb\u52a1\u6570taskCount=\uff08completed + queue + active\uff09/\u5468\u671f\uff08\u79d2\uff09 threadpool.completedTaskCount \u7edf\u8ba1\u5468\u671f\u5185\u5e73\u5747\u6bcf\u79d2\u5b8c\u6210\u7684\u4efb\u52a1\u6570completedTaskCount=completed/\u5468\u671f\uff08\u79d2\uff09"},{"location":"general-development/metrics.html#_4","title":"\u5f00\u53d1\u8005\u4fe1\u606f\u548c\u9ad8\u7ea7\u8bfe\u9898","text":"<ul> <li>\u5b9e\u73b0\u539f\u7406</li> </ul> <pre><code>1. \u57fa\u4e8e[netflix spectator](https://github.com/Netflix/spectator)\n2. Foundation-metrics\u901a\u8fc7SPI\u673a\u5236\u52a0\u8f7d\u6240\u6709MetricsInitializer\u5b9e\u73b0\uff0c\u5b9e\u73b0\u8005\u53ef\u4ee5\u901a\u8fc7MetricsInitializer\u4e2d\u7684getOrder\u89c4\u5212\u6267\u884c\u987a\u5e8f\uff0corder\u6570\u5b57\u8d8a\u5c0f\uff0c\u8d8a\u5148\u6267\u884c\u3002\n3. Metrics-core\u5b9e\u73b03\u7c7bMetricsInitializer\uff1a\n 1. DefaultRegistryInitializer: \u5b9e\u4f8b\u5316\u5e76\u6ce8\u518cspectator-reg-servo\uff0c\u8bbe\u7f6e\u8f83\u5c0f\u7684order\uff0c\u4fdd\u8bc1\u6bd4\u4e0b\u97622\u7c7bMetricsInitializer\u5148\u6267\u884c\n 2. Meters Initializer: \u5b9e\u73b0TPS\u3001\u65f6\u5ef6\u3001\u7ebf\u7a0b\u6c60\u3001jvm\u8d44\u6e90\u7b49\u7b49\u6570\u636e\u7684\u7edf\u8ba1\n 3. Publisher: \u8f93\u51fa\u7edf\u8ba1\u7ed3\u679c\uff0c\u5185\u7f6e\u4e86\u65e5\u5fd7\u8f93\u51fa\uff0c\u4ee5\u53ca\u901a\u8fc7RESTful\u63a5\u53e3\u8f93\u51fa\n4. Metrics-prometheus\u63d0\u4f9b\u4e0eprometheus\u5bf9\u63a5\u7684\u80fd\u529b\n</code></pre> <ul> <li>\u4e1a\u52a1\u5b9a\u5236</li> </ul> <p>\u56e0\u4e3aServiceComb\u5df2\u7ecf\u521d\u59cb\u5316\u4e86servo\u7684registry\uff0c\u6240\u4ee5\u4e1a\u52a1\u4e0d\u5fc5\u518d\u521b\u5efaregistry\u3002\u5b9e\u73b0MetricsInitializer\u63a5\u53e3\uff0c\u5b9a \u4e49\u4e1a\u52a1\u7ea7\u7684Meters\uff0c\u6216\u5b9e\u73b0\u5b9a\u5236\u7684Publisher\uff0c\u518d\u901a\u8fc7SPI\u673a\u5236\u58f0\u660e\u81ea\u5df1\u7684\u5b9e\u73b0\u5373\u53ef\u3002</p> <p>1.Meters</p> <pre><code>\u521b\u5efaMeters\u80fd\u529b\u5747\u7531spectator\u63d0\u4f9b\uff0c\u53ef\u67e5\u9605[netflix spectator](https://github.com/Netflix/spectator)\u6587\u6863\n</code></pre> <p>2.Publisher</p> <pre><code>\u5468\u671f\u6027\u8f93\u51fa\u7684\u573a\u666f\uff0c\u6bd4\u5982\u65e5\u5fd7\u573a\u666f\uff0c\u901a\u8fc7eventBus\u8ba2\u9605org.apache.servicecomb.foundation.metrics.PolledEvent\uff0cPolledEvent.getMeters()\u5373\u662f\u672c\u5468\u671f\u7684\u7edf\u8ba1\u7ed3\u679c\n \u975e\u5468\u671f\u6027\u8f93\u51fa\u7684\u573a\u666f\uff0c\u6bd4\u5982\u901a\u8fc7RESTful\u63a5\u53e3\u8bbf\u95ee\uff0c\u901a\u8fc7globalRegistry.iterator()\u5373\u53ef\u5f97\u5230\u672c\u5468\u671f\u7684\u7edf\u8ba1\u7ed3\u679c\n</code></pre>"},{"location":"general-development/microservice-invocation-chain.html","title":"\u5fae\u670d\u52a1\u8c03\u7528\u94fe","text":""},{"location":"general-development/microservice-invocation-chain.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u5fae\u670d\u52a1\u67b6\u6784\u89e3\u51b3\u4e86\u5f88\u591a\u5355\u4f53\u5e94\u7528\u5e26\u6765\u7684\u95ee\u9898\uff0c\u4f46\u540c\u65f6\u4e5f\u9700\u8981\u6211\u4eec\u4ed8\u51fa\u989d\u5916\u7684\u4ee3\u4ef7\u3002\u7531\u4e8e\u7f51\u7edc\u7684\u4e0d\u7a33\u5b9a\u6027\u5e26\u6765\u7684\u8bf7\u6c42\u5904\u7406\u5ef6\u8fdf\u5c31\u662f\u4ee3\u4ef7\u4e4b\u4e00\u3002</p> <p>\u5728\u5355\u4f53\u5e94\u7528\u4e2d\uff0c\u6240\u6709\u6a21\u5757\u90fd\u5728\u540c\u4e00\u4e2a\u8fdb\u7a0b\u4e2d\u8fd0\u884c\uff0c\u6240\u4ee5\u5e76\u6ca1\u6709\u6a21\u5757\u95f4\u4e92\u901a\u7684\u95ee\u9898\u3002\u4f46\u5fae\u670d\u52a1\u67b6\u6784\u4e2d\uff0c\u670d\u52a1\u95f4\u901a\u8fc7\u7f51\u7edc\u6c9f\u901a\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5f97\u4e0d\u5904\u7406\u548c\u7f51\u7edc\u6709\u5173\u7684 \u95ee\u9898\uff0c\u4f8b\u5982\uff1a\u5ef6\u8fdf\u3001\u8d85\u65f6\u3001\u7f51\u7edc\u5206\u533a\u7b49\u3002</p> <p>\u53e6\u5916\uff0c\u968f\u7740\u4e1a\u52a1\u7684\u6269\u5c55\u670d\u52a1\u589e\u591a\uff0c\u6211\u4eec\u5f88\u96be\u6d1e\u5bdf\u6570\u636e\u5982\u4f55\u5728\u86db\u7f51\u822c\u590d\u6742\u7684\u670d\u52a1\u7ed3\u6784\u4e2d\u6d41\u8f6c\u3002\u6211\u4eec\u5982\u4f55\u624d\u80fd\u6709\u6548\u7684\u76d1\u63a7\u7f51\u7edc\u5ef6\u8fdf\u5e76\u4e14\u53ef\u89c6\u5316\u670d\u52a1\u4e2d\u7684\u6570\u636e\u6d41\u8f6c\u5462\uff1f</p> <p>\u5206\u5e03\u5f0f\u8c03\u7528\u94fe\u8ffd\u8e2a\u7528\u4e8e\u6709\u6548\u5730\u76d1\u63a7\u5fae\u670d\u52a1\u7684\u7f51\u7edc\u5ef6\u65f6\u5e76\u53ef\u89c6\u5316\u5fae\u670d\u52a1\u4e2d\u7684\u6570\u636e\u6d41\u8f6c\u3002</p>"},{"location":"general-development/microservice-invocation-chain.html#zipkin","title":"Zipkin","text":"<p>Zipkin\u662f\u4e00\u4e2a\u5206\u5e03\u5f0f\u8c03\u7528\u94fe\u8ffd\u8e2a\u7cfb\u7edf\u3002 \u5b83\u80fd\u5e2e\u52a9\u7528\u6237\u6536\u96c6\u65f6\u5e8f\u6570\u636e\u7528\u4ee5\u5b9a\u4f4d\u5fae\u670d\u52a1\u4e2d\u7684\u5ef6\u8fdf\u95ee\u9898\uff0c\u5b83\u540c\u65f6\u7ba1\u7406\u8ffd\u8e2a\u6570\u636e\u7684\u6536\u96c6 \u548c\u67e5\u8be2\u3002Zipkin \u7684\u8bbe\u8ba1\u57fa\u4e8e Google Dapper paper\u3002</p> <p>ServiceComb \u96c6\u6210\u4e86 Zipkin \u63d0\u4f9b\u81ea\u52a8\u8c03\u7528\u94fe\u8ffd\u8e2a\u80fd\u529b\uff0c\u5982\u6b64\u4e00\u6765\u7528\u6237\u53ea\u9700\u8981\u4e13\u6ce8\u5b9e\u73b0\u5176\u4e1a\u52a1\u9700\u6c42\u3002</p>"},{"location":"general-development/microservice-invocation-chain.html#_2","title":"\u4f7f\u7528\u6b65\u9aa4:","text":""},{"location":"general-development/microservice-invocation-chain.html#_3","title":"\u6dfb\u52a0\u4f9d\u8d56","text":"<p>\u57fa\u4e8e ServiceComb Java Chassis \u7684\u5fae\u670d\u52a1\u53ea\u9700\u8981\u6dfb\u52a0\u5982\u4e0b\u4f9d\u8d56\u5230 pom.xml\uff1a</p> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;handler-tracing-zipkin&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u5982\u679c\u5fae\u670d\u52a1\u662f\u57fa\u4e8e Spring Cloud + Zuul \u7684 API \u7f51\u5173\uff0c\u4f8b\u5982 workshop demo \u4e2d\u7684 manager service \uff0c\u6211\u4eec\u8fd8\u9700\u8981\u52a0\u5165\u5982\u4e0b\u7684\u989d\u5916\u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;spring-cloud-zuul-zipkin&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre>"},{"location":"general-development/microservice-invocation-chain.html#_4","title":"\u914d\u7f6e\u8ffd\u8e2a\u5904\u7406\u548c\u6570\u636e\u6536\u96c6 {#\u914d\u7f6e\u8ffd\u8e2a\u5904\u7406\u548c\u6570\u636e\u6536\u96c6}","text":"<p>\u5728microservice.yaml\u6587\u4ef6\u4e2d\u8bbe\u7f6e\u8ffd\u8e2a\u5904\u7406\u5668\u548c\u6570\u636e\u6536\u96c6\u670d\u52a1\u5730\u5740</p> <pre><code> servicecomb: \n handler: \n chain: \n Consumer: \n default: tracing-consumer\n Provider: \n default: tracing-provider\n servicecomb: \n tracing: \n collector: \n address: http://zipkin.servicecomb.io:9411\n</code></pre> <p>\u5c31\u8fd9\u6837\uff0c\u5728\u52a0\u4e86\u4e24\u4e2a\u914d\u7f6e\u9879\uff0c\u6ca1\u6539\u52a8\u4e00\u884c\u4ee3\u7801\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u542f\u52a8\u4e86\u57fa\u4e8e Zipkin \u548c Java chassis \u7684\u5206\u5e03\u5f0f\u8c03\u7528\u94fe\u8ffd\u8e2a\u7684\u529f\u80fd\u3002</p> <p>\u6ce8\u610f \u5982\u679c\u9879\u76ee\u4e2d\u7684\u5176\u4ed6\u4f9d\u8d56\u4e5f\u5f15\u5165\u4e86 zipkin \uff08\u4f8b\u5982 Spring Cloud\uff09\uff0c\u53ef\u80fd\u5bfc\u81f4 zipkin \u7248\u672c\u4e0d\u4e00\u81f4\u800c\u8fd0\u884c\u51fa\u9519\uff0c\u8fd9\u65f6\u9700\u8981\u5728\u9879\u76ee pom \u4e2d\u58f0\u660e zipkin \u7248\u672c\u3002</p>"},{"location":"general-development/multienvironment.html","title":"\u5fae\u670d\u52a1\u5b9e\u4f8b\u95f4\u591a\u73af\u5883\u9694\u79bb","text":"<p>\u8fdb\u884c\u670d\u52a1\u53d1\u73b0\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u8005\u9700\u8981\u4e86\u89e3\u672c\u5fae\u670d\u52a1\u80fd\u591f\u53d1\u73b0\u90a3\u4e9b\u5176\u4ed6\u670d\u52a1\u7684\u5b9e\u4f8b\u3002ServiceComb\u63d0\u4f9b\u4e86\u5206\u5c42\u6b21\u7684\u5b9e\u4f8b\u9694\u79bb\u3002</p>"},{"location":"general-development/multienvironment.html#_2","title":"\u5fae\u670d\u52a1\u5b9e\u4f8b\u5206\u5c42\u7ba1\u7406","text":"<p>\u8981\u4e86\u89e3\u5b9e\u4f8b\u95f4\u7684\u9694\u79bb\u5c42\u6b21\uff0c\u9996\u5148\u9700\u8981\u4e86\u89e3ServiceComb\u5b9a\u4e49\u7684\u4e00\u4e2a\u4f53\u7cfb\u5b8c\u5907\u7684\u5fae\u670d\u52a1\u7cfb\u7edf\u7ed3\u6784\uff1a</p> <p></p> <p>\u5728\u5fae\u670d\u52a1\u7cfb\u7edf\u7ed3\u6784\u4e2d\uff0c\u9876\u5c42\u662f\u9879\u76ee\uff08project\uff09\uff0c\u9879\u76ee\u4e2d\u7684\u5e94\u7528\u5206\u5c5e\u4e8e\u4e0d\u540c\u73af\u5883\uff08environment\uff09\uff0c\u5373\u6d4b\u8bd5\u548c\u751f\u4ea7\u73af\u5883\u53ef\u4ee5\u5206\u5f00\uff0c\u6bcf\u4e2a\u73af\u5883\u4e0b\u5305\u542b\u591a\u4e2a\u5e94\u7528\uff08application\uff09\uff0c\u5728\u67d0\u4e2a\u7279\u5b9a\u5e94\u7528\u7684\u7279\u5b9a\u73af\u5883\u4e2d\uff0c\u5305\u542b\u591a\u4e2a\u5fae\u670d\u52a1\uff08service\uff09\uff0c\u4e00\u4e2a\u5fae\u670d\u52a1\u53c8\u53ef\u4ee5\u540c\u65f6\u5b58\u5728\u591a\u4e2a\u7248\u672c\uff08version\uff09\u3002 \u4ee5\u4e0a\uff0c\u662f\u6240\u6709\u9759\u6001\u5143\u6570\u636e\u7684\u8303\u7574\uff0c\u67d0\u4e2a\u7279\u5b9a\u670d\u52a1\u7684\u7279\u5b9a\u7248\u672c\u5219\u5305\u542b\u591a\u4e2a\u5728\u8fd0\u884c\u65f6\u6ce8\u518c\u4e0a\u6765\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u56e0\u4e3a\u670d\u52a1\u5b9e\u4f8b\u7684\u4fe1\u606f\u5728\u8fd0\u884c\u65f6\u968f\u7740\u7cfb\u7edf\u7684\u4f38\u7f29\u3001\u6545\u969c\u7b49\u539f\u56e0\u662f\u52a8\u6001\u53d8\u5316\u7684\uff0c\u6240\u4ee5\u670d\u52a1\u5b9e\u4f8b\u7684\u8def\u7531\u4fe1\u606f\u53c8\u4e3a\u52a8\u6001\u6570\u636e\u3002\u901a\u8fc7\u5206\u5c42\u7ba1\u7406\u5fae\u670d\u52a1\u7684\u8fd9\u4e9b\u6570\u636e\uff0c\u4e5f\u5c31\u81ea\u7136\u800c\u7136\u5730\u5b9e\u73b0\u4e86\u5b9e\u4f8b\u4e4b\u95f4\u7684\u903b\u8f91\u9694\u79bb\u3002 * Project\u5bf9\u5e94\u5230\u534e\u4e3a\u4e91\u4e0a\u5404region\u4e0b\u521b\u5efa\u7684project\uff0c\u4e0d\u540c\u7684project\u4e92\u76f8\u9694\u79bb\uff0c\u5982\u679c\u8be5region\u4e0b\u6ca1\u6709\u65b0\u5efaproject\uff0c\u5219\u4ee3\u8868\u8be5region\uff1b\u4f8b\u5982\uff0c\u5728\u534e\u5317\u533a\uff08cn-north-1\uff09\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u5b57\u4e3atianjing\u7684project\uff0c\u82e5\u60f3\u5fae\u670d\u52a1\u6ce8\u518c\u5230\u8be5project\u4e0b\uff0c\u53ef\u4ee5\u5728microservice.yaml\u6587\u4ef6\u91cc\u914d\u7f6e\uff1a</p> <pre><code> servicecomb:\n credentials:\n project: cn-north-1_tianjing\n</code></pre> <ul> <li> <p>Environment\u8868\u793a\u5f53\u524d\u5fae\u670d\u52a1\u5b9e\u4f8b\u6240\u5c5e\u73af\u5883\uff0c\u53ef\u5728microservice.yaml\u6587\u4ef6\u91cc\u901a\u8fc7service_description.environment\u914d\u7f6e\u5f53\u524d\u5b9e\u4f8b\u73af\u5883\u3002</p> </li> <li> <p>Application\u4ee3\u8868\u4e00\u4e2a\u8f6f\u4ef6\u5e94\u7528\u7684\u903b\u8f91\u5b9e\u4f53\uff0c\u8868\u793a\u4e00\u4e2a\u6709\u4e1a\u52a1\u529f\u80fd\u5448\u73b0\u7ed9\u7528\u6237\u7684\u8ba1\u7b97\u673a\u8f6f\u4ef6\u5e94\u7528\uff0c\u53ef\u5728microservice.yaml\u6587\u4ef6\u91cc\u901a\u8fc7APPLICATION_ID\u914d\u7f6e\u5e94\u7528\u540d\u3002</p> </li> <li> <p>Service\u662f\u5bf9\u6309\u9700\u53d6\u7528\u7684\u529f\u80fd\u5bf9\u8c61\u7684\u4e00\u79cd\u63cf\u8ff0\uff0c\u4e00\u4e2a\u5e94\u7528\u4e0b\u5b58\u5728\u591a\u4e2a\u670d\u52a1\uff0c\u5404\u670d\u52a1\u95f4\u76f8\u4e92\u8c03\u7528\uff0c\u53ef\u5728microservice.yaml\u6587\u4ef6\u91cc\u901a\u8fc7service_description.name\u6307\u5b9a\u670d\u52a1\u540d\u3002</p> </li> <li> <p>Version\u8868\u793a\u5f53\u524d\u670d\u52a1\u7684\u7248\u672c\uff0c\u4e00\u4e2a\u670d\u52a1\u4e0b\u53ef\u5b58\u5728\u591a\u4e2a\u7248\u672c\uff0c\u53ef\u5728microservice.yaml\u6587\u4ef6\u91cc\u901a\u8fc7service_description.version\u914d\u7f6e\u5f53\u524d\u5fae\u670d\u52a1\u7248\u672c\u53f7\uff1b\u6d88\u8d39\u7aef\u8fdb\u884c\u8bbf\u95ee\u65f6\uff0c\u9ed8\u8ba4\u6309\u7167\u8def\u7531\u89c4\u5219\u8fdb\u884c\u8bbf\u95ee\uff0c\u53ef\u4ee5\u5728\u6d88\u8d39\u7aef\u901a\u8fc7servicecomb.references.[providerName].version-rule\u8bbe\u7f6e\u7248\u672c\u89c4\u5219\u3002</p> </li> </ul>"},{"location":"general-development/multienvironment.html#_3","title":"\u5178\u578b\u573a\u666f","text":""},{"location":"general-development/multienvironment.html#_4","title":"\u5e94\u7528\u95f4\u9694\u79bb\u53ca\u8de8\u5e94\u7528\u8c03\u7528","text":""},{"location":"general-development/multienvironment.html#_5","title":"\u529f\u80fd\u4ecb\u7ecd","text":"<p>\u5728ServiceComb\u6846\u67b6\u4e2d\uff0c\u4e00\u4e2a\u5e94\u7528\u4e0b\u5305\u542b\u591a\u4e2a\u5fae\u670d\u52a1\u3002 \u540c\u4e00\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u516c\u5171\u670d\u52a1\u90e8\u7f72\u5230\u591a\u4e2a\u5e94\u7528\uff0c\u901a\u8fc7\u6307\u5b9a\u4e0d\u540c\u7684APPLICATION_ID\u6765\u5b9e\u73b0\u3002</p> <p></p> <p>\u4e0d\u540c\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u53ea\u5141\u8bb8\u5728\u540c\u4e00\u4e2a\u5e94\u7528\u91cc\u76f8\u4e92\u8c03\u7528\uff0c\u5f53\u7528\u6237\u9700\u8981\u4e0d\u540c\u5e94\u7528\u95f4\u7684\u5fae\u670d\u52a1\u76f8\u4e92\u8c03\u7528\u65f6\uff0c\u5c31\u9700\u8981\u5f00\u542f\u8de8\u5e94\u7528\u8c03\u7528\u529f\u80fd\u3002 </p>"},{"location":"general-development/multienvironment.html#_6","title":"\u914d\u7f6e\u8bf4\u660e\uff1a","text":"<ol> <li>\u82e5\u8981\u5f00\u542f\u8de8\u5e94\u7528\u8c03\u7528\uff0c\u9996\u5148\u9700\u5728provider\u7aef\u7684microservice.yaml\u6587\u4ef6\u5f00\u542f\u8de8\u5e94\u7528\u8c03\u7528\u914d\u7f6e\u3002\u914d\u7f6e\u9879\u5982\u4e0b\uff1a</li> </ol> <pre><code> service_description:\n properties:\n allowCrossApp: true\n</code></pre> <ol> <li>Consumer\u7aef\u6307\u5b9a\u5fae\u670d\u52a1\u540d\u79f0\u8c03\u7528provider\u7684\u65f6\u5019\uff0c\u9700\u8981\u52a0\u4e0aprovider\u6240\u5c5e\u7684\u5e94\u7528ID\uff0c\u683c\u5f0f\u7531[microserviceName]\u53d8\u4e3a[appID]:[microserviceName]\u3002</li> </ol>"},{"location":"general-development/multienvironment.html#_7","title":"\u4ee3\u7801\u793a\u4f8b\uff1a","text":"<p>\u5047\u8bbeconsumer\u6240\u5c5e\u5e94\u7528\u4e3ahelloApp\uff0cprovider\u6240\u5c5e\u5e94\u7528\u4e3ahellApp2\uff0c\u5fae\u670d\u52a1\u540d\u79f0\u4e3ahelloProvider\u3002 * RestTemplate\u8c03\u7528\u65b9\u5f0f \u5f53consumer\u7aef\u4ee5RestTemplate\u65b9\u5f0f\u5f00\u53d1\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u65f6\uff0c\u9700\u8981\u5728\u8c03\u7528\u7684URL\u4e2d\u5c06[microserviceName]\u6539\u4e3a[appID]:[microserviceName]\uff0c\u5982\u4e0b\uff1a</p> <pre><code>RestTemplate restTemplate = RestTemplateBuilder.create();\nResponseEntity&lt;String&gt; responseEntity = restTemplate.getForEntity(\u201ccse://helloApp2:helloProvider/hello/sayHello?name={name}\u201d, String.class, \u201cServiceComb\u201d);\n</code></pre> <ul> <li>RPC\u8c03\u7528\u65b9\u5f0f \u5f53consumer\u7aef\u4ee5RPC\u65b9\u5f0f\u5f00\u53d1\u5fae\u670d\u52a1\u6d88\u8d39\u8005\u65f6\uff0c\u58f0\u660e\u7684\u670d\u52a1\u63d0\u4f9b\u8005\u4ee3\u7406\u5982\u4e0b\uff1a</li> </ul> <pre><code>@RpcReference(schemaId = \u201chello\u201d, microserviceName = \u201chelloApp2:helloProvider\u201d)\nprivate Hello hello;\n</code></pre> <p>\u8de8\u5e94\u7528\u8c03\u7528\u4e0e\u540c\u5e94\u7528\u4e0b\u8c03\u7528\u5fae\u670d\u52a1\u7684\u65b9\u5f0f\u76f8\u540c\uff1a</p> <pre><code>hello.sayHello(\u201cServiceComb\u201d);\n</code></pre>"},{"location":"general-development/multienvironment.html#_8","title":"\u5178\u578b\u573a\u666f","text":""},{"location":"general-development/multienvironment.html#_9","title":"\u5f00\u53d1\u73af\u5883\u4e92\u76f8\u9694\u79bb\u53ca\u5feb\u901f\u5f00\u53d1","text":""},{"location":"general-development/multienvironment.html#_10","title":"\u529f\u80fd\u4ecb\u7ecd","text":"<p>ServiceComb\u6846\u67b6\u901a\u8fc7\u8bbe\u7f6eenvironment\uff0c\u53ef\u4ee5\u5c06\u5fae\u670d\u52a1\u5b9e\u4f8b\u6807\u8bb0\u4e3a\u5f00\u53d1\u3001\u6d4b\u8bd5\u3001\u9884\u751f\u4ea7\u3001\u751f\u4ea7\u73af\u5883\uff0c\u5b9e\u73b0\u4e86\u5728\u5b9e\u4f8b\u7ea7\u522b\u7684\u5929\u7136\u9694\u79bb\uff1b\u5ba2\u6237\u7aef\u5728\u67e5\u627e\u670d\u52a1\u7aef\u5b9e\u4f8b\u7684\u65f6\u5019\uff0c\u53ea\u80fd\u53d1\u73b0\u76f8\u540cenvironment\u4e0b\u7684\u670d\u52a1\u7aef\u5b9e\u4f8b\u3002</p> <p></p> <p>ServiceComb\u5728\u8bbe\u8ba1\u65f6\uff0c\u4e25\u683c\u4f9d\u8d56\u4e8e\u5951\u7ea6\uff0c\u6240\u4ee5\u6b63\u5e38\u60c5\u51b5\u4e0b\u5951\u7ea6\u53d8\u4e86\uff0c\u5c31\u5fc5\u987b\u8981\u4fee\u6539\u5fae\u670d\u52a1\u7684\u7248\u672c\u3002\u4f46\u662f\u5982\u679c\u5f53\u524d\u8fd8\u662f\u5f00\u53d1\u6a21\u5f0f\uff0c\u90a3\u4e48\u4fee\u6539\u63a5\u53e3\u5c31\u662f\u5f88\u6b63\u5e38\u7684\u60c5\u51b5\uff0c\u5f53\u4fee\u6539\u5b8c\u6bd5\u518d\u6b21\u542f\u52a8\u5f53\u524d\u670d\u52a1\u65f6\uff0c\u65b0\u751f\u6210\u7684\u5951\u7ea6\u548cService Center\u4e0a\u4fdd\u5b58\u7684\u65e7\u5951\u7ea6\u4f1a\u51b2\u7a81\u5e76\u62a5\u9519\uff0c\u5bfc\u81f4\u542f\u52a8\u5931\u8d25\uff0c\u5982\u679c\u6bcf\u6b21\u90fd\u901a\u8fc7\u4fee\u6539\u5fae\u670d\u52a1\u7248\u672c\u53f7\uff0c\u6216\u8005\u5220\u9664\u8be5\u670d\u52a1\u5728Service Center\u4e0a\u7684\u7f13\u5b58\u6570\u636e\u6765\u89e3\u51b3\uff0c\u663e\u7136\u5bf9\u5f00\u53d1\u4eba\u5458\u5f88\u4e0d\u53cb\u597d\u3002 ServiceComb\u6846\u67b6\u652f\u6301\u5728\u5f00\u53d1\u6001\u8fdb\u884c\u5fae\u670d\u52a1\u7684\u5feb\u901f\u8c03\u8bd5\uff0c\u901a\u8fc7\u5c06environment\u914d\u7f6e\u4e3adevelopment\u5373\u53ef\u3002\u5f53\u63a5\u53e3\u4fee\u6539\u4e86\uff08Schema\u53d1\u751f\u4e86\u53d8\u5316\uff09\uff0c\u91cd\u542f\u5c31\u53ef\u4ee5\u6b63\u5e38\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\uff0c\u800c\u4e0d\u7528\u4fee\u6539\u7248\u672c\u53f7\u3002 \u4f46\u662f\u5982\u679c\u6709consumer\u5df2\u7ecf\u8c03\u7528\u4e86\u91cd\u542f\u4e4b\u524d\u7684\u670d\u52a1\uff0c\u90a3\u4e48consumer\u7aef\u4e5f\u9700\u8981\u91cd\u542f\u624d\u80fd\u83b7\u53d6\u6700\u65b0provider\u7684schema\uff1b\u6bd4\u5982A-&gt;B\uff0cB\u63a5\u53e3\u8fdb\u884c\u4e86\u4fee\u6539\u5e76\u4e14\u91cd\u542f\uff0c\u90a3\u4e48A\u8fd9\u4e2a\u65f6\u5019\u8fd8\u662f\u4f7f\u7528B\u4e4b\u524d\u7684schema\uff0c\u8c03\u7528\u53ef\u80fd\u4f1a\u51fa\u9519\uff0c\u4ee5\u514d\u51fa\u73b0\u672a\u77e5\u5f02\u5e38\uff0cA\u4e5f\u9700\u8981\u91cd\u542f\u3002 </p>"},{"location":"general-development/multienvironment.html#_11","title":"\u914d\u7f6e\u8bf4\u660e\uff1a","text":"<p>\u4ec5\u652f\u6301\u4ee5\u4e0b\u679a\u4e3e\u503c\uff1adevelopment,testing,acceptance,production\uff0c\u4e0d\u914d\u7f6e\u7684\u60c5\u51b5\u4e0b\u7f3a\u7701\u503c\u4e3a\"\"\uff08\u7a7a\uff09\u3002 \u65b9\u6cd51\uff1a\u901a\u8fc7JVM\u542f\u52a8\u53c2\u6570-Dservice_description.environment=development\uff08\u679a\u4e3e\u503c\uff09\u8fdb\u884c\u8bbe\u7f6e\uff1b \u65b9\u6cd52\uff1a\u901a\u8fc7microservice.yaml\u914d\u7f6e\u6587\u4ef6\u6765\u6307\u5b9a\uff1a</p> <pre><code> service_description:\n environment: development\n</code></pre> <ul> <li>\u65b9\u6cd53\uff1a\u901a\u8fc7\u73af\u5883\u53d8\u91cfSERVICECOMB_ENV\u6765\u6307\u5b9a\uff08\u4ec5\u9650\u4e8ewindows\u7cfb\u7edf\uff09\uff0c\u82e5\u662f\u5f00\u53d1\u6001\uff0c\u5176\u503c\u914d\u7f6e\u4e3adevelopment\uff1b</li> </ul>"},{"location":"general-development/multienvironment.html#_12","title":"\u5178\u578b\u573a\u666f","text":""},{"location":"general-development/multienvironment.html#_13","title":"\u4e24\u5730\u4e09\u4e2d\u5fc3","text":""},{"location":"general-development/multienvironment.html#_14","title":"\u529f\u80fd\u4ecb\u7ecd","text":"<p>\u5728\u4ee5\u4e24\u5730\u4e09\u4e2d\u5fc3\u7684\u89e3\u51b3\u65b9\u6848\u8fdb\u884c\u8de8\u5730\u533a\u90e8\u7f72\u670d\u52a1\u7684\u573a\u666f\uff0c\u540c\u4e00\u5957\u670d\u52a1\u5b58\u5728\u4e8e\u591a\u4e2aavailableZone\u4e2d\uff0c\u9700\u8981\u5b9e\u73b0\u4f18\u5148\u8c03\u7528\u540c\u4e00\u4e2aAZ\u5185\u7684\u5e94\u7528\uff0c\u82e5\u672cAZ\u51fa\u73b0\u95ee\u9898\uff0c\u8981\u80fd\u591f\u8bbf\u95ee\u53e6\u4e00\u4e2aAZ\u4e0b\u7684\u5e94\u7528\uff0c\u4ece\u800c\u4fdd\u8bc1\u670d\u52a1\u7684\u53ef\u9760\u6027\u3002 ServiceComb\u63d0\u4f9b\u4e86\u6570\u636e\u4e2d\u5fc3\u914d\u7f6e\uff0c\u6765\u5b9e\u73b0\u5bf9\u5fae\u670d\u52a1\u7684\u5206\u533a\u548c\u7ba1\u7406\u3002\u6570\u636e\u4e2d\u5fc3\u5305\u542b3\u4e2a\u5c5e\u6027\uff1aservicecomb.datacenter.name, servicecomb.datacenter.region, servicecomb.datacenter.availableZone\uff0c\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f\u4e0d\u63d0\u4f9b\u9694\u79bb\u80fd\u529b\uff0c\u5fae\u670d\u52a1\u53ef\u4ee5\u53d1\u73b0\u5176\u4ed6\u6570\u636e\u4e2d\u5fc3\u7684\u5b9e\u4f8b\u3002\u4f46\u662f\u53ef\u4ee5\u901a\u8fc7\u542f\u7528\u5b9e\u4f8b\u4eb2\u548c\u6027\uff0c\u6765\u4f18\u5148\u5f80\u6307\u5b9a\u7684\u533a\u57df\u6216\u8005Zone\u53d1\u6d88\u606f\u3002</p> <p></p> <p>\u5ba2\u6237\u7aef\u5728\u8def\u7531\u7684\u65f6\u5019\uff0c\u4f1a\u4f18\u5148\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230zone/region\u90fd\u76f8\u540c\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u662fregion\u76f8\u540c\uff0c\u4f46zone\u4e0d\u76f8\u540c\u7684\u5b9e\u4f8b\uff0c\u90fd\u4e0d\u76f8\u540c\u7684\u65f6\u5019\uff0c\u5219\u6309\u7167\u8def\u7531\u89c4\u5219\u9009\u62e9\u4e00\u4e2a\u3002\u4eb2\u548c\u6027\u4e0d\u662f\u903b\u8f91\u9694\u79bb\uff0c\u53ea\u8981\u5b9e\u4f8b\u4e4b\u95f4\u7f51\u7edc\u662f\u8054\u901a\u7684\uff0c\u90a3\u4e48\u90fd\u6709\u53ef\u80fd\u8bbf\u95ee\u5230\uff1b\u5982\u679c\u7f51\u7edc\u4e0d\u901a\uff0c\u5219\u4f1a\u8bbf\u95ee\u5931\u8d25\u3002 \u5728\u534e\u4e3a\u4e91\u4e0a\u90e8\u7f72\u65f6\uff0c\u53ef\u5c06region\u548cavailableZone\u7684\u503c\u4e0e\u534e\u4e3a\u4e91\u7684region\uff08\u4f8b\u5982\uff1acn-north-1\uff09\u548c\u53ef\u7528\u533a\u5bf9\u5e94\u8d77\u6765\uff0c\u4f46\u662f\u56e0\u4e3a\u534e\u4e3a\u4e91\u4e0a\u7684\u4e0d\u540cregion\u76ee\u524d\u7f51\u7edc\u4e0d\u4e92\u901a\uff0c\u6240\u4ee5\u6b64\u65f6\u4e0d\u652f\u6301\u8de8region\u8bbf\u95ee\uff1b\u9664\u4e86\u5bf9\u5e94\u534e\u4e3a\u4e91\u7684region\u503c\uff0c\u4e5f\u53ef\u4ee5\u81ea\u884c\u5b9a\u4e49\u5176\u4ed6\u503c\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f5c\u76f8\u5e94\u8c03\u6574\uff0c\u975e\u5e38\u7075\u6d3b\u3002 </p>"},{"location":"general-development/multienvironment.html#_15","title":"\u914d\u7f6e\u8bf4\u660e\uff1a","text":"<pre><code>servicecomb:\n datacenter:\n name: mydatacenter\n region: my-Region\n availableZone: my-Zone\n</code></pre>"},{"location":"general-development/produceprocess.html","title":"\u8fd4\u56de\u503c\u5e8f\u5217\u5316\u6269\u5c55","text":""},{"location":"general-development/produceprocess.html#_2","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u5f53\u524dREST\u901a\u9053\u8fd4\u56de\u503c\u652f\u6301application/json\u548ctext/plain\u4e24\u79cd\u683c\u5f0f\uff0c\u652f\u6301\u5f00\u53d1\u4eba\u5458\u6269\u5c55\u548c\u91cd\u5199\uff0c\u670d\u52a1\u63d0\u4f9b\u8005\u901a\u8fc7produces\u58f0\u660e\u53ef\u63d0\u4f9b\u5e8f\u5217\u5316\u80fd\u529b\uff0c\u670d\u52a1\u6d88\u8d39\u8005\u901a\u8fc7\u8bf7\u6c42\u7684Accept\u5934\u6307\u660e\u8fd4\u56de\u503c\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u9ed8\u8ba4\u8fd4\u56deapplication/json\u683c\u5f0f\u7684\u6570\u636e\u3002</p>"},{"location":"general-development/produceprocess.html#_3","title":"\u5f00\u53d1\u8bf4\u660e","text":"<ul> <li>\u6269\u5c55</li> </ul> <p>\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u901a\u8fc7\u7f16\u7a0b\u7684\u65b9\u5f0f\u6765\u6269\u5c55\u8fd4\u56de\u503c\u5e8f\u5217\u5316\u65b9\u5f0f\u3002\u5b9e\u65bd\u6b65\u9aa4\u5982\u4e0b\uff0c\u4ee5\u6269\u5c55\u652f\u6301application/xml\u683c\u5f0f\u4e3a\u4f8b\uff1a</p> <p>1.\u5b9e\u73b0\u63a5\u53e3<code>ProduceProcessor</code></p> <p>getName()\u8fd4\u56de\u5f53\u524d\u6269\u5c55\u7684\u6570\u636e\u7c7b\u578b\u540d</p> <p>getOrder()\u8fd4\u56de\u5f53\u524d\u6570\u636e\u7c7b\u578b\u4f18\u5148\u7ea7\uff0c\u6709\u591a\u4e2a\u540c\u540d\u5b9e\u73b0\u7c7b\u65f6\u751f\u6548\uff0c\u53ea\u52a0\u8f7d\u4f18\u5148\u7ea7\u6700\u9ad8\u7684\uff0c\u6570\u5b57\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8</p> <p>doEncodeResponse(OutputStream output, Object result)\u628aresult\u5bf9\u8c61\u7f16\u7801\u6210output\uff0c\u6b64\u5904\u903b\u8f91\u9700\u8981\u81ea\u884c\u5b9e\u73b0</p> <p>doDecodeResponse(InputStream input, JavaType type)\u628ainput\u89e3\u6790\u6210\u76f8\u5e94\u5bf9\u8c61\uff0c\u6b64\u5904\u903b\u8f91\u9700\u8981\u81ea\u884c\u5b9e\u73b0</p> <p>```java public class ProduceAppXmlProcessor implements ProduceProcessor {</p> <pre><code>@Override\npublic String getName() {\n return MediaType.APPLICATION_XML;\n}\n\n@Override\npublic int getOrder() {\n return 0;\n}\n\n@Override\npublic void doEncodeResponse(OutputStream output, Object result) throws Exception {\n output.write(JAXBUtils.convertToXml(result).getBytes());\n}\n\n@Override\npublic Object doDecodeResponse(InputStream input, JavaType type) throws Exception {\n return JAXBUtils.convertToJavaBean(input, type);\n}\n</code></pre> <p>} ```</p> <p>2.\u6dfb\u52a0\u914d\u7f6e\u6587\u4ef6</p> <p>\u5728resources\u4e0bMETA-INF/services/\u6587\u4ef6\u5939\u65b0\u5efa\u6587\u4ef6xxx.ProduceProcessor\uff08xxx\u4e3a\u63a5\u53e3\u7684\u5305\u540d\uff09\uff0c\u5185\u5bb9\u586b\u5199xxx.ProduceAppXmlProcessor\uff08xxx\u4e3a\u5b9e\u73b0\u7c7b\u7684\u5305\u540d\uff09\u3002</p> <ul> <li>\u91cd\u5199</li> </ul> <p>\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u5bf9\u73b0\u6709\u7684application/json\u548ctext/plain\u4e24\u79cd\u683c\u5f0f\u5b9e\u73b0\u903b\u8f91\u8fdb\u884c\u91cd\u5199\uff0c\u4e5f\u53ef\u4ee5\u5bf9\u81ea\u884c\u6269\u5c55\u7684\u683c\u5f0f\u8fdb\u884c\u91cd\u5199\uff0c\u4ee5\u91cd\u5199xml\u5e8f\u5217\u5316\u65b9\u5f0f\u4e3a\u4f8b\uff1a</p> <p>1.\u521b\u5efa\u4e00\u4e2a\u540c\u540d\u7c7b<code>ProduceAppXmlProcessor</code>\uff0c\u5b9e\u73b0\u63a5\u53e3<code>ProduceProcessor</code></p> <p>2.\u91cd\u5199<code>doEncodeResponse</code>\u548c<code>doDecodeResponse</code>\u65b9\u6cd5\u91cc\u7684\u7f16\u89e3\u7801\u903b\u8f91</p> <p>3.\u66f4\u6539getOrder\u65b9\u6cd5\u91cc\u7684\u8fd4\u56de\u503c\uff0c\u8981\u6bd4\u539f\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u5c0f\uff0c\u4f8b\u5982\u8fd4\u56de-1\uff0capplication/json\u548ctext/plain\u7684\u539f\u65b9\u6cd5\u8fd4\u56de\u503c\u9ed8\u8ba4\u90fd\u4e3a0</p> <p>4.\u5728resources\u4e0bMETA-INF/services/\u6587\u4ef6\u5939\u65b0\u5efa\u6587\u4ef6xxx.ProduceProcessor\uff08xxx\u4e3a\u63a5\u53e3\u7684\u5305\u540d\uff09\uff0c\u5185\u5bb9\u586b\u5199xxx.ProduceAppXmlProcessor\uff08xxx\u4e3a\u5b9e\u73b0\u7c7b\u7684\u5305\u540d\uff09\u3002</p> <ul> <li>\u9a8c\u8bc1</li> </ul> <p>\u670d\u52a1\u63d0\u4f9b\u8005\u901a\u8fc7produces\u58f0\u660e\u53ef\u63d0\u4f9bxml\u5e8f\u5217\u5316\u80fd\u529b</p> <p><code>java @RequestMapping(path = \"/appXml\", method = RequestMethod.POST, produces = MediaType.APPLICATION_XML_VALUE) public JAXBPerson appXml(@RequestBody JAXBPerson person) { return person; }</code></p> <p>\u670d\u52a1\u6d88\u8d39\u8005\u901a\u8fc7\u8bf7\u6c42\u7684Accept\u5934\u6307\u660e\u8fd4\u56de\u503cxml\u5e8f\u5217\u5316\u65b9\u5f0f</p> <p><code>java private void testCodeFirstAppXml(RestTemplate template, String cseUrlPrefix) { JAXBPerson person = new JAXBPerson(\"jake\", 22, \"it\", \"60kg\"); person.setJob(new JAXBJob(\"developer\", \"coding\")); HttpHeaders headers = new HttpHeaders(); headers.add(\"Accept\", MediaType.APPLICATION_XML_VALUE); HttpEntity&lt;JAXBPerson&gt; requestEntity = new HttpEntity&lt;&gt;(person, headers); ResponseEntity&lt;JAXBPerson&gt; resEntity = template.exchange(cseUrlPrefix + \"appXml\", HttpMethod.POST, requestEntity, JAXBPerson.class); TestMgr.check(person, resEntity.getBody()); }</code></p>"},{"location":"general-development/proxy.html","title":"\u4ee3\u7406\u8bbe\u7f6e","text":"<p>\u4f5c\u4e3a\u4e00\u540d\u5f00\u53d1\u8005\uff0c\u5728\u516c\u53f8\u5f00\u53d1\u73af\u5883\uff0c\u53ef\u80fd\u662f\u901a\u8fc7\u516c\u53f8\u4ee3\u7406\u7f51\u7edc\u63a5\u5165\u5230\u56e0\u7279\u7f51\u3002\u5982\u679c\u8c03\u8bd5\u670d\u52a1\u65f6\u8fd8\u5fc5\u987b\u4f9d\u8d56\u7f51\u4e0a\u8d44\u6e90\uff0c\u6bd4\u5982\u76f4\u63a5\u8fde\u63a5\u516c\u6709\u4e91\u670d\u52a1\u4e2d\u5fc3\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u914d\u7f6e\u4ee3\u7406\u3002</p> <p>\u914d\u7f6e\u65b9\u5f0f\uff0c\u5728 microservice.yaml \u6587\u4ef6\u589e\u52a0 proxy \u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n proxy:\n enable: true #\u662f\u5426\u5f00\u542f\u4ee3\u7406\n host: yourproxyaddress #\u4ee3\u7406\u5730\u5740\n port: 80 #\u4ee3\u7406\u7aef\u53e3\n username: yourname #\u7528\u6237\u540d\n passwd: yourpassword #\u5bc6\u7801\n</code></pre> <p>\u6709\u4e9b\u7528\u6237\u9700\u8981\u901a\u8fc7\u52a0\u5bc6\u4fdd\u62a4\u5bc6\u7801\u4fe1\u606f\u3002\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0SPI\u6269\u5c55\u6765\u5b9e\u73b0\u3002\u9700\u8981\u6269\u5c55\u7684SPI\u63a5\u53e3\u540d\u79f0\u4e3a\uff1aorg.apache.servicecomb.foundation.common.encrypt.Encryption\uff0c\u5b9e\u73b0 decode \u63a5\u53e3\u5373\u53ef\u3002</p>"},{"location":"general-development/reactive.html","title":"Reactive","text":""},{"location":"general-development/reactive.html#producer","title":"\u7b80\u5355\u540c\u6b65\u6a21\u5f0f\u7684Producer\uff1a","text":"<p>\u793a\u4f8b\u4ee3\u7801\uff1a</p> <pre><code>@GetMapping(path = \"/hello/{name}\")\npublic String hello(@PathVariable(name = \"name\") String name){\n return \"hello \" + name;\n}\n</code></pre> <p>\u4e0e\u6b64\u5bf9\u5e94\u7684\u5904\u7406\u6d41\u7a0b\u5982\u4e0b\uff1a</p> <p></p> <p>\u8fd9\u662f\u4f20\u7edf\u5178\u578b\u7684\u5de5\u4f5c\u6a21\u578b\uff0c\u6838\u5fc3\u601d\u60f3\u662f\u4e0d\u963b\u585e\u7f51\u7edc\u7ebf\u7a0b\uff0c\u5c06\u4e1a\u52a1\u653e\u5728\u72ec\u7acb\u7684\u7ebf\u7a0b\u4e2d\u5904\u7406\uff08\u4e3a\u4e86\u7b80\u5316\u8868\u8fbe\uff0cexecutor\u4e2d\u53ea\u753b\u4e00\u4e2a\u7ebf\u7a0b\uff09</p> <p>\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u6b64\u6a21\u5f0f\u95ee\u9898\u4e0d\u5927\u3002</p>"},{"location":"general-development/reactive.html#_1","title":"\u5d4c\u5957\u540c\u6b65\u8c03\u7528\uff1a","text":"<p>\u4e0d\u662f\u6240\u6709\u7684\u4e1a\u52a1\u90fd\u662f\u7b80\u5355\u5904\u7406\u4e00\u4e0b\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u5e94\u7b54\uff0c\u53ef\u80fd\u8fd8\u9700\u8981\u8c03\u7528\u5176\u4ed6\u5fae\u670d\u52a1.</p> <p>\u793a\u4f8b\u4ee3\u7801\uff1a</p> <pre><code>public interface Intf{\n String hello(String name);\n}\n\n@GetMapping(path = \"/hello/{name}\")\npublic String hello(@PathVariable(name = \"name\") String name){\n return \"from remote: hello \" + intf.hello(name);\n}\n</code></pre> <p>\u4e0e\u6b64\u5bf9\u5e94\u7684\u5904\u7406\u6d41\u7a0b\u5982\u4e0b\uff1a</p> <p></p> <p>\u6839\u636e\u8fd9\u4e2a\u6d41\u7a0b\u7684\u7279\u70b9\uff0c\u53ef\u4ee5\u770b\u5230\u4f1a\u4ea7\u751f\u4ee5\u4e0b\u7ed3\u679c\uff1a</p> <ul> <li> <p>\u56e0\u4e3a\u662f\u540c\u6b65\u8c03\u7528\uff0c\u5728\u201cOther microservices\u201d\u672a\u5e94\u7b54\u4e4b\u524d\u201cMicroservice A\u201d\u7684\u8c03\u7528\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u963b\u585e\u7b49\u5f85\u72b6\u6001\uff0c\u4e0d\u5904\u7406\u4efb\u4f55\u5176\u4ed6\u4e8b\u52a1</p> </li> <li> <p>\u5f53Executor\u4e2d\u6240\u6709\u7ebf\u7a0b\u90fd\u5728\u7b49\u5f85\u8fdc\u7a0b\u5e94\u7b54\u65f6\uff0c\u6240\u6709\u65b0\u7684\u8bf7\u6c42\u90fd\u53ea\u80fd\u5728Queue\u4e2d\u6392\u961f\uff0c\u5f97\u4e0d\u5230\u5904\u7406\uff0c\u6b64\u65f6\u6574\u4e2a\u7cfb\u7edf\u76f8\u5f53\u4e8e\u505c\u6b62\u5de5\u4f5c\u4e86</p> </li> <li> <p>\u8981\u589e\u52a0\u5904\u7406\u80fd\u529b\uff0c\u53ea\u80fd\u589e\u52a0Executor\u4e2d\u7684\u7ebf\u7a0b\u6570\uff0c\u800c\u64cd\u4f5c\u7cfb\u7edf\u5e76\u4e0d\u80fd\u65e0\u9650\u5730\u589e\u52a0\u7ebf\u7a0b\u6570\uff0c\u4e8b\u5b9e\u4e0a\u589e\u52a0\u7ebf\u7a0b\u6570\u5e26\u6765\u7684\u6536\u76ca\u662f\u4e00\u4e2a\u629b\u7269\u7ebf\u6a21\u578b\uff0c\u8d85\u51fa\u4e00\u5b9a\u7684\u4e34\u754c\u503c\u540e\uff0c\u7cfb\u7edf\u7684\u5904\u7406\u80fd\u529b\u5176\u5b9e\u4f1a\u4e0b\u964d\uff0c\u800c\u8fd9\u4e2a\u4e34\u754c\u503c\u5e76\u4e0d\u4f1a\u592a\u5927</p> </li> <li> <p>\u5f53\u4e1a\u52a1\u903b\u8f91\u4e2d\uff0c\u9700\u8981\u591a\u6b21\u8fdb\u884c\u8fdc\u7a0b\u540c\u6b65\u64cd\u4f5c\u65f6\uff0c\u4f1a\u66f4\u52a0\u6076\u5316\u8fd9\u4e2a\u73b0\u8c61</p> </li> </ul>"},{"location":"general-development/reactive.html#_2","title":"\u5d4c\u5957\u540c\u6b65\u8c03\u7528\u7684\u201c\u9519\u8bef\u201d\u4f18\u5316\uff1a","text":"<p>\u9488\u5bf9\u524d\u4e00\u573a\u666f\uff0c\u6709\u4eba\u4f1a\u8ba4\u4e3a\u5c06\u201cInvoke producer method\u201d\u4e22\u8fdb\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u6c60\uff0c\u53ef\u4ee5\u89e3\u51b3\u95ee\u9898\uff0c\u5305\u62ec\u4ee5\u4e0b\u5904\u7406\u65b9\u5f0f\uff1a</p> <ul> <li> <p>\u5728producer method\u6253\u6807\u6ce8@Async\uff0c\u7531AOP\u8d1f\u8d23\u5c06\u5bf9\u8be5\u65b9\u6cd5\u7684\u8c03\u7528\u4e22\u8fdb\u5176\u4ed6\u7ebf\u7a0b\u6c60\u53bb</p> </li> <li> <p>\u5728producer method\u5185\u90e8\u901a\u8fc7\u4e1a\u52a1\u4ee3\u7801\u8f6c\u79fb\u7ebf\u7a0b</p> </li> </ul> <p>\u5f62\u6210\u4ee5\u4e0b\u6d41\u7a0b\uff1a</p> <p></p> <p>\u6839\u636e\u8fd9\u4e2a\u6d41\u7a0b\u7684\u7279\u70b9\uff0c\u53ef\u4ee5\u770b\u5230\u4f1a\u4ea7\u751f\u4ee5\u4e0b\u7ed3\u679c\uff1a</p> <ul> <li> <p>\u201cInvoke producer method\u201d\u5fc5\u987b\u7acb\u5373\u8fd4\u56de\uff0c\u5426\u5219Executor\u7ebf\u7a0b\u8fd8\u662f\u5f97\u4e0d\u5230\u91ca\u653e</p> </li> <li> <p>\u201cInvoke producer method\u201d\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u65b0\u7684\u673a\u5236\u544a\u77e5\u8c03\u7528\u6d41\u7a0b\u81ea\u5df1\u7684\u8fd4\u56de\u503c\uff0c\u4e0d\u662f\u6700\u7ec8\u8fd4\u56de\u503c\uff08\u5f53\u524d\u6ca1\u6709\u8fd9\u4e2a\u673a\u5236\uff09</p> </li> <li> <p>\u867d\u7136Executor\u7ebf\u7a0b\u91ca\u653e\u4e86\uff0c\u4f46\u662fCustomer Executor\uff0c\u5176\u5b9e\u8fd8\u662f\u963b\u585e\u4f4f\uff0c\u5728\u7b49\u5f85\u8fdc\u7aef\u5e94\u7b54\uff0c\u6574\u4e2a\u7cfb\u7edf\u7684\u963b\u585e\u72b6\u6001\u5e76\u6ca1\u6709\u5f97\u5230\u6539\u53d8\uff1b\u800c\u4e14\u8fd8\u51ed\u7a7a\u591a\u4e86\u4e00\u6b21\u7ebf\u7a0b\u5207\u6362</p> </li> <li> <p>\u8be5\u673a\u5236\u770b\u4e0a\u53bb\uff0c\u552f\u4e00\u7684\u4f5c\u7528\uff0c\u662f\u91ca\u653e\u4e86executor\u7ebf\u7a0b\uff0c\u8ba9executor\u7ebf\u7a0b\u6709\u673a\u4f1a\u5904\u7406\u5176\u4ed6\u8bf7\u6c42\uff0c\u8fd9\u76f8\u5f53\u4e8e\u9694\u79bb\u4ed3\u7684\u6982\u5ff5\uff0c\u5904\u7406\u901f\u5ea6\u6162\u7684\u4e1a\u52a1\u4e0d\u8981\u5f71\u54cd\u5176\u4ed6\u4e1a\u52a1\uff1b\u4f46\u662f\u8fd9\u4e2a\u6982\u5ff5serviceComb\u662f\u53ef\u4ee5\u76f4\u63a5\u652f\u6301\u7684\uff0c\u53ef\u4ee5\u914d\u7f6e\u6307\u5b9a\u7684\u4e1a\u52a1\u65b9\u6cd5\u72ec\u5360\u5168\u65b0\u7684executor\uff0c\u8fd9\u6837\u6574\u4e2a\u6d41\u7a0b\u5c31\u8ddf\u201c\u5d4c\u5957\u540c\u6b65\u8c03\u7528\u201d\u5b8c\u5168\u4e00\u6837\uff0c\u6d41\u7a0b\u66f4\u7b80\u5355\uff0c\u800c\u4e0d\u9700\u8981\u5728\u201cInvoke producer method\u201d\u5c42\u6b21\u6765\u505a\u8fd9\u4e2a\u4e8b\u60c5</p> </li> </ul>"},{"location":"general-development/reactive.html#reactive","title":"\u7eafReactive\u673a\u5236","text":"<p>\u793a\u4f8b\u4ee3\u7801\uff1a</p> <pre><code>public interface Intf{\n CompletableFuture&lt;String&gt; hello(String name);\n}\n\n@GetMapping(path = \"/hello/{name}\")\npublic CompletableFuture&lt;String&gt; hello(@PathVariable(name = \"name\") String name){\n CompletableFuture&lt;String&gt; future = new CompletableFuture&lt;&gt;();\n intf.hello(name).whenComplete((result, exception) -&gt; {\n if (exception == null) {\n future.complete(\"from remote: \" + result);\n return;\n }\n\n future.completeExceptionally(exception);\n });\n return future;\n}\n</code></pre> <p>\u4e0e\u6b64\u5bf9\u5e94\u7684\u5904\u7406\u6d41\u7a0b\u5982\u4e0b\uff1a</p> <p></p> <ul> <li> <p>\u4e0e\u4f20\u7edf\u6d41\u7a0b\u4e0d\u540c\u7684\u662f\uff0c\u6240\u6709\u529f\u80fd\u90fd\u5728eventloop\u4e2d\u6267\u884c\uff0c\u5e76\u4e0d\u4f1a\u8fdb\u884c\u7ebf\u7a0b\u5207\u6362</p> </li> <li> <p>\u6a59\u8272\u7bad\u5934\u8d70\u5b8c\u540e\uff0c\u5bf9\u672c\u7ebf\u7a0b\u7684\u5360\u7528\u5373\u5b8c\u6210\u4e86\uff0c\u4e0d\u4f1a\u963b\u585e\u7b49\u5f85\u5e94\u7b54\uff0c\u8be5\u7ebf\u7a0b\u53ef\u4ee5\u5904\u7406\u5176\u4ed6\u4efb\u52a1</p> </li> <li> <p>\u5f53\u6536\u5230\u8fdc\u7aef\u5e94\u7b54\u540e\uff0c\u7531\u7f51\u7edc\u6570\u636e\u9a71\u52a8\u5f00\u59cb\u8d70\u7ea2\u8272\u7bad\u5934\u7684\u5e94\u7b54\u6d41\u7a0b</p> </li> <li> <p>\u53ea\u8981\u6709\u4efb\u52a1\uff0c\u7ebf\u7a0b\u5c31\u4e0d\u4f1a\u505c\u6b62\uff0c\u4f1a\u4e00\u76f4\u6267\u884c\u4efb\u52a1\uff0c\u53ef\u4ee5\u5145\u5206\u5229\u7528cpu\u8d44\u6e90\uff0c\u4e5f\u4e0d\u4f1a\u4ea7\u751f\u591a\u4f59\u7684\u7ebf\u7a0b\u5207\u6362\uff0c\u53bb\u65e0\u8c13\u5730\u6d88\u8017cpu\u3002</p> </li> </ul> <p>\u56e0\u4e3a\u540c\u6b65\u6a21\u5f0f\u4e0b\uff0c\u9700\u8981\u5927\u91cf\u7684\u7ebf\u7a0b\u6765\u63d0\u5347\u5e76\u53d1\u5ea6\uff0c\u800c\u5927\u91cf\u7684\u7ebf\u7a0b\u53c8\u5e26\u6765\u7ebf\u7a0b\u5207\u6362\u7684\u989d\u5916\u6d88\u8017\u3002</p> <p>\u6d4b\u8bd5\u6570\u636e\u8868\u660e\uff0creactive\u6a21\u5f0f\uff0c\u53ea\u9700\u8981\u6d88\u8017\u540c\u6b65\u6a21\u5f0f\u4e0d\u5230\u4e00\u534a\u7684cpu\uff0c\u5373\u53ef\u8fbe\u5230\u6216\u8d85\u8fc7\u540c\u6b65\u6a21\u5f0f\u7684tps\uff0c\u5e76\u4e14\u65f6\u5ef6\u66f4\u4f4e\u3002</p>"},{"location":"general-development/reactive.html#reactive_1","title":"\u6df7\u5408Reactive\u673a\u5236","text":"<p>Reactvie\u8981\u6c42\uff1a\u6240\u6709\u5728eventloop\u4e2d\u6267\u884c\u7684\u903b\u8f91\uff0c\u4e0d\u5141\u8bb8\u6709\u4efb\u4f55\u7684\u963b\u585e\u52a8\u4f5c\uff0c\u5305\u62ec\u4e0d\u9650\u4e8ewait\u3001sleep\u3001\u5de8\u5927\u5faa\u73af\u3001\u540c\u6b65\u67e5\u8be2DB\u7b49\u7b49\u3002</p> <p>serviceComb\u5e95\u5c42\u662f\u57fa\u4e8evertx\u7684\uff0cvertx\u751f\u6001\u4e2d\u6709jdbc\u3001mq\u3001zooKeeper\u7b49\u7b49\u5404\u79cd\u4e30\u5bcc\u7ec4\u4ef6\u7684reactive\u9a71\u52a8\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u90fd\u53ef\u4ee5\u6ee1\u8db3\u8981\u6c42\u3002</p> <p>\u4f46\u662f\u6709\u7684\u573a\u666f\u4e0b\uff0c\u786e\u5b9e\u6709\u7684\u540c\u6b65\u64cd\u4f5c\u65e0\u6cd5\u907f\u514d\uff0c\u6bd4\u5982\uff1a</p> <ul> <li> <p>\u79c1\u6709\u7684\u5b89\u5168\u52a0\u56fa\u7684redis\uff0c\u53ea\u63d0\u4f9b\u4e86\u540c\u6b65\u9a71\u52a8</p> </li> <li> <p>\u8f83\u590d\u6742\u7684\u4e1a\u52a1\u8fd0\u7b97</p> </li> <li> <p>\u2026\u2026</p> </li> </ul> <p>\u6b64\u65f6\uff0c\u53ef\u4ee5\u5c06\u8fd9\u4e9b\u540c\u6b65\u7684\u903b\u8f91\u62bd\u53d6\u51fa\u6765\u653e\u5230\u7ebf\u7a0b\u6c60\u4e2d\u53bb\u5904\u7406\uff0c\u800c\u5176\u4ed6\u90e8\u5206\u4ecd\u7136\u4f7f\u7528reactive\u7684\u6d41\u7a0b\u3002</p>"},{"location":"general-development/reactive.html#reactive_2","title":"\u5173\u4e8ereactive\u7684\u4e00\u4e9b\u8bf4\u660e\uff1a","text":"<ul> <li> <p>Producer\uff1a</p> </li> <li> <p>producer\u662f\u5426\u4f7f\u7528reactive\u4e0econsumer\u5982\u4f55\u8c03\u7528\uff0c\u6ca1\u6709\u4efb\u4f55\u8054\u7cfb</p> </li> <li> <p>\u5f53operation\u8fd4\u56de\u503c\u4e3aCompletableFuture\u7c7b\u578b\u65f6\uff0c\u9ed8\u8ba4\u6b64operation\u5de5\u4f5c\u4e8ereactive\u6a21\u5f0f\uff0c\u6b64\u65f6\u5982\u679c\u9700\u8981\u5f3a\u5236\u6b64operation\u5de5\u4f5c\u4e8e\u7ebf\u7a0b\u6c60\u6a21\u5f0f\uff0c\u9700\u8981\u5728microservice.yaml\u4e2d\u660e\u786e\u914d\u7f6e\uff1b\u5047\u8bbe\u67d0operation\uff0c\u5176schemaId\u4e3asid\uff0coperationId\u4e3aasyncQuery\uff0c\u5219\u9700\u8981\u8fdb\u884c\u4ee5\u4e0b\u914d\u7f6e\uff1a</p> </li> </ul> <pre><code>servicecomb:\n executors:\n Provider:\n sid.asyncQuery: cse.executor.groupThreadPool\n</code></pre> <p>\u8fd9\u91cc\u7684cse.executor.groupThreadPool\u662fserviceComb\u5185\u7f6e\u7684\u9ed8\u8ba4\u7ebf\u7a0b\u6c60\uff0c\u7528\u6237\u53ef\u4ee5\u4efb\u610f\u6307\u5b9a\u4e3a\u81ea\u5df1\u7684\u5b9a\u5236\u7ebf\u7a0b\u6c60\u3002</p> <ul> <li> <p>Consumer\uff1a</p> </li> <li> <p>consumer\u662f\u5426\u4f7f\u7528reactive\u4e0eproducer\u5982\u4f55\u5b9e\u73b0\uff0c\u6ca1\u6709\u4efb\u4f55\u8054\u7cfb</p> </li> <li> <p>\u5f53\u524d\u53ea\u652f\u6301\u900f\u660eRPC\u6a21\u5f0f\uff0c\u4f7f\u7528JDK\u539f\u751f\u7684CompletableFuture\u6765\u627f\u8f7d\u6b64\u529f\u80fd</p> <p>completableFuture\u7684when\u3001then\u7b49\u7b49\u529f\u80fd\u90fd\u53ef\u76f4\u63a5\u4f7f\u7528</p> <p>\u4f46\u662fcompletableFuture\u7684async\u7cfb\u5217\u529f\u80fd\uff0c\u5176\u5b9e\u662f\u53e6\u5916\u542f\u7ebf\u7a0b\u6c60\u6765\u6267\u884c\u529f\u80fd\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528</p> <p>\u5173\u4e8eRxJava Observable\u7684\u652f\u6301\u540e\u7eed\u4f1a\u52a0\u5165</p> <p>\u5173\u4e8eAsyncRestTemplate\u7684\u652f\u6301\u540e\u7eed\u4f1a\u52a0\u5165</p> </li> </ul>"},{"location":"general-development/report-framework-version.html","title":"\u6846\u67b6\u4e0a\u62a5\u7248\u672c\u53f7","text":""},{"location":"general-development/report-framework-version.html#_1","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u4e3a\u65b9\u4fbf\u6cbb\u7406\uff0c\u4f7f\u7528ServiceComb\u8fdb\u884c\u5f00\u53d1\uff0c\u4f1a\u5c06\u5f53\u524d\u4f7f\u7528\u7684ServiceComb\u7248\u672c\u53f7\u4e0a\u62a5\u81f3\u670d\u52a1\u4e2d\u5fc3\uff0c\u5e76\u4e14\u652f\u6301\u5176\u4ed6\u6846\u67b6\u96c6\u6210ServiceComb\u65f6\u4e0a\u62a5\u5176\u4ed6\u6846\u67b6\u7684\u7248\u672c\u53f7\u3002</p>"},{"location":"general-development/report-framework-version.html#_2","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>\u6b65\u9aa41 \u9996\u5148\u5b9e\u73b0\u5f00\u6e90\u6846\u67b6ServiceComb\u7684Versions\u63a5\u53e3\uff0c\u5b9e\u73b0\u8be5\u63a5\u53e3\u4e0b\u7684loadVersion\u65b9\u6cd5\uff0c\u5373\u53ef\u5c06\u7248\u672c\u540d\u79f0\u548c\u7248\u672c\u53f7\u4f5c\u4e3a\u952e\u503c\u5bf9\u8fd4\u56de</p> <pre><code>public class MyVersion implements Versions{\n @Override\n public Map&lt;String, String&gt; loadVersion() {\n Map&lt;String, String&gt; map = new HashMap&lt;&gt;();\n map.put(\"My\", this.getClass().getPackage().getImplementationVersion());\n return map;\n }\n}\n</code></pre> <p>\u6b65\u9aa42 \u4e3a\u4e86\u4f7f\u7528SPI\u673a\u5236\u8ba9\u8be5\u8fd4\u56de\u5bf9\u8c61\u88abServiceComb\u8bfb\u53d6\u5230\uff0c\u9700\u8981\u5728META-INF\u4e2d\u589e\u52a0services\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u5176\u4e2d\u589e\u52a0\u4e00\u4e2a\u6587\u4ef6\uff0c\u4ee5\u6240\u5b9e\u73b0\u63a5\u53e3x.x.x.Versions(\u5e26\u5305\u540d)\u4e3a\u540d\uff0c\u4ee5\u5177\u4f53\u5b9e\u73b0\u7c7bx.x.x.CseVersion(\u5e26\u5305\u540d)\u4e3a\u5185\u5bb9</p> <p>\u5f53\u670d\u52a1\u6ce8\u518c\u5230ServiceCenter\u65f6\uff0c\u4f1a\u643a\u5e26\u6240\u6709\u7248\u672c\u53f7\u4fe1\u606f</p> <pre><code>{\n \"serviceId\": \"xxx\",\n \"appId\": \"xxx\",\n \"registerBy\": \"SDK\",\n \"framework\": {\n \"name\": \"servicecomb-java-chassis\",\n \"version\": \"My:x.x.x;ServiceComb:x.x.x\"\n } \n}\n</code></pre> <ul> <li>\u5907\u6ce8</li> </ul> <p>\u4e0a\u62a5\u7684\u7248\u672c\u53f7\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u4e5f\u53ef\u4ee5\u4ecepom\u6216jar\u5305\u7684MANIFEST.MF\u91cc\u8bfb\u53d6\uff0c\u5982\u679c\u4f7f\u7528.class.getPackage().getImplementationVersion()\u4eceMANIFEST.MF\u83b7\u53d6\u7248\u672c\u53f7\uff0c\u5219\u9700\u8981\u5728pom\u6587\u4ef6\u4e2d\u628amaven-jar-plugin\u7684archive\u5143\u7d20addDefaultImplementationEntries\u548caddDefaultSpecificationEntries\u8bbe\u7f6e\u4e3atrue</p> <pre><code>&lt;plugin&gt;\n &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;\n &lt;configuration&gt;\n &lt;archive&gt;\n &lt;manifest&gt;\n &lt;addDefaultImplementationEntries&gt;true&lt;/addDefaultImplementationEntries&gt;\n &lt;addDefaultSpecificationEntries&gt;true&lt;/addDefaultSpecificationEntries&gt;\n &lt;/manifest&gt;\n &lt;/archive&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;\n</code></pre>"},{"location":"general-development/secret-field.html","title":"\u5b9a\u5236\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u65b9\u6cd5","text":""},{"location":"general-development/secret-field.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7531\u4e8eHTTP\u534f\u8bae\u7684\u975e\u5b89\u5168\u6027\uff0c\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u7684\u6570\u636e\u80fd\u8f7b\u6613\u88ab\u5404\u79cd\u6293\u5305\u5de5\u5177\u76d1\u542c\u3002\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u4e1a\u52a1\u5bf9\u5e94\u7528\u6216\u670d\u52a1\u95f4\u4f20\u8f93\u7684\u654f\u611f\u6570\u636e\u6709\u8f83\u9ad8\u7684\u5b89\u5168\u8981\u6c42\uff0c\u8fd9\u7c7b\u6570\u636e\u9700\u8981\u7279\u522b\u7684\u52a0\u5bc6\u4fdd\u62a4\uff08\u4e1a\u52a1\u4e0d\u540c\u5bf9\u7b97\u6cd5\u8981\u6c42\u4e0d\u540c\uff09\uff0c\u8fd9\u6837\u5373\u4f7f\u5185\u5bb9\u88ab\u622a\u83b7\uff0c\u4e5f\u53ef\u4ee5\u4fdd\u62a4\u5176\u4e2d\u7684\u654f\u611f\u6570\u636e\u4e0d\u88ab\u8f7b\u6613\u83b7\u53d6\u3002</p>"},{"location":"general-development/secret-field.html#_2","title":"\u89e3\u51b3\u65b9\u6cd5","text":"<p>\u670d\u52a1\u95f4\u7684\u901a\u4fe1\u79bb\u5f00\u4e0d\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u7684\u573a\u666f\uff0c\u4f7f\u7528jackson\u7c7b\u5e93\u63d0\u4f9b\u7684 @JsonSerialize \u548c @JsonDeserialize \u6ce8\u89e3\u529f\u80fd\uff0c\u5bf9\u654f\u611f\u6570\u636e\u5b9a\u5236\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u65b9\u6cd5\uff0c\u5e76\u5728\u5b9a\u5236\u5316\u7684\u65b9\u6cd5\u4e2d\u5b9e\u73b0\u52a0\u89e3\u5bc6\u529f\u80fd\u3002</p> <p>\u6ce8\u89e3\u63cf\u8ff0\u53c2\u8003\uff1a\u5728 https://github.com/FasterXML/jackson-databind/wiki \u4e2d\u67e5\u627e\u5bf9\u5e94\u7248\u672c\u7684Javadocs</p>"},{"location":"general-development/secret-field.html#_3","title":"\u793a\u4f8b","text":"<p>1.\u5bf9 Person \u5bf9\u8c61\u4e2d\u7684 name \u5c5e\u6027\uff0c\u901a\u8fc7\u6ce8\u89e3\u8bbe\u5b9a\u4f7f\u7528\u7279\u5b9a\u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u65b9\u6cd5\u3002\u6ce8\uff1a\u6b64\u5904\u6f14\u793a\u5982\u4f55\u4f7f\u7528\uff0c\u4e0d\u6d89\u53ca\u52a0\u89e3\u5bc6\u76f8\u5173\u3002</p> <pre><code>public class Person {\n private int usrId;\n\n //\u6307\u5b9a\u6570\u636e name \u4f7f\u7528\u7279\u5b9a\u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u65b9\u6cd5\n @JsonSerialize(using = SecretSerialize.class)\n @JsonDeserialize(using = SecretDeserialize.class)\n private String name;\n\n public int getUsrId() {\n return usrId;\n }\n\n public void setUsrId(int usrId) {\n this.usrId = usrId;\n }\n\n public String getName() {\n return name;\n }\n\n public void setName(String name) {\n this.name = name;\n }\n\n @Override\n public String toString() {\n return \"Person{\" +\n \"usrId=\" + usrId +\n \", name='\" + name + '\\'' +\n '}';\n }\n}\n</code></pre> <p>2.\u5b9a\u4e49 SecretSerialize \u7c7b \u548c SecretDeserialize \u7c7b\uff0c\u5e76\u91cd\u5199\u5176\u65b9\u6cd5</p> <pre><code>public class SecretSerialize extends JsonSerializer&lt;String&gt; {\n\n //\u91cd\u5199 name \u7684\u5e8f\u5217\u5316\u65b9\u6cd5\uff0c\u53ef\u5728\u6b64\u5b9e\u73b0\u7528\u6237\u5b9a\u5236\u7684\u52a0\u89e3\u5bc6\u6216\u5176\u4ed6\u64cd\u4f5c\n @Override\n public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)\n throws IOException, JsonProcessingException {\n //\u5728\u6570\u636e name \u540e\u589e\u52a04\u4e2a\u7279\u5b9a\u5b57\u7b26\n value = value + \" &amp;#@\";\n\n //\u6267\u884c\u5e8f\u5217\u5316\u64cd\u4f5c\n gen.writeString(value);\n }\n}\n\npublic class SecretDeserialize extends JsonDeserializer&lt;String&gt; {\n\n //\u91cd\u5199 name \u7684\u53cd\u5e8f\u5217\u5316\u65b9\u6cd5\uff0c\u4e0eserialize\u5e8f\u5217\u5316\u65b9\u6cd5\u5339\u914d\uff0c\u6309\u7528\u6237\u5b9a\u5236\u7684\u89c4\u5219\u83b7\u53d6\u771f\u5b9e\u6570\u636e\n @Override\n public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {\n //\u83b7\u53d6\u53cd\u5e8f\u5217\u5316\u6570\u636e\uff0c\u9664\u53bb4\u4e2a\u7279\u5b9a\u5b57\u7b26\uff0c\u83b7\u53d6\u771f\u5b9e\u7684 name\n String value = p.getValueAsString();\n value = value.substring(0, value.length() - 4);\n return value;\n }\n}\n</code></pre>"},{"location":"general-development/service-information-printer.html","title":"\u670d\u52a1\u4fe1\u606f\u6253\u5370","text":""},{"location":"general-development/service-information-printer.html#_2","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u4e3a\u4e86\u4f7f\u7528\u6237\u53ef\u4ee5\u66f4\u5feb\u6377\uff0c\u65b9\u4fbf\u7684\u83b7\u5f97\u670d\u52a1\u4fe1\u606f\uff0c\u5c06\u670d\u52a1\u4fe1\u606f\u8fdb\u884c\u6574\u7406\uff0c\u5e76\u5728\u65e5\u5fd7\u4e2d\u6253\u5370\u51fa\u6765</p>"},{"location":"general-development/service-information-printer.html#_3","title":"\u6548\u679c","text":"<p>\u4e0d\u8bba\u670d\u52a1\u521b\u5efa\u6210\u529f\u4e0e\u5426\uff0c\u670d\u52a1\u4fe1\u606f\u90fd\u4f1a\u5728\u65e5\u5fd7\u4fe1\u606f\u7684\u672b\u5c3e\u88ab\u81ea\u52a8\u6253\u51fa\uff0c\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\"Service Information is shown below\"\u8fdb\u884c\u5b9a\u4f4d</p> <pre><code>2019-08-21 16:37:14,859 [INFO] Service information is shown below:\nservice center: [http://127.0.0.1:30100]\nconfig center: [http://127.0.0.1:30113]\nAppID: Restful-Service-HelloWorld\nServiceName: restful_provider\nVersion: 0.0.1\nEnvironment: production\nServiceID: a3344e9ad4557f883b36d7f53e33306fbc0a54ad\nInstanceID; e0765a8ec3ee11e9910d0255ac105780\n org.apache.servicecomb.core.SCBEngine$1.afterRegistryInstance(SCBEngine.java:243)\n</code></pre>"},{"location":"general-development/service-information-printer.html#_4","title":"\u6269\u5c55","text":""},{"location":"general-development/service-information-printer.html#_5","title":"\u76f8\u5173\u7684\u63a5\u53e3","text":"<p>\u63a5\u53e3BootUpInformationCollector</p> <p>collect(): \u8fd4\u56de\u4e00\u4e2astring\uff0c\u4e5f\u5c31\u662f\u670d\u52a1\u4e2d\u9700\u8981\u6253\u5370\u7684\u4fe1\u606f getOrder(): \u8fd4\u56deBootUpInformationCollector\u5b9e\u73b0\u7c7b\u7684\u4f18\u5148\u7ea7\uff0c\u6570\u5b57\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8</p>"},{"location":"general-development/service-information-printer.html#_6","title":"\u7528\u6237\u6269\u5c55","text":"<p>\u7528\u6237\u5982\u679c\u9700\u8981\u5bf9\u6253\u5370\u4fe1\u606f\u8fdb\u884c\u8fdb\u4e00\u6b65\u6269\u5c55\uff0c\u9700\u8981 1. \u6839\u636eBootUpInformationCollector\u521b\u5efa\u65b0\u7684\u7c7b\uff0c\u5e76\u8d4b\u4e88\u5408\u9002\u7684order\u3002 2. \u521b\u5efaSPI\u6587\u4ef6</p>"},{"location":"general-development/service-information-printer.html#_7","title":"\u6837\u4f8b","text":"<ol> <li>\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5b9e\u73b0\u7c7bHelloCollector</li> </ol> <pre><code>public class HelloCollector implements BootUpInformationCollector {\n @Override\n public String collect() {\n return \"Hello!\";\n }\n\n @Override\n public int getOrder() {\n return 5;\n }\n}\n</code></pre> <p>\u7531\u4e8eorder\u662f5\uff0c\u6240\u4ee5\u8fd9\u4e2a\u7c7b\u4f1a\u5728\u5730\u5740\u4fe1\u606f\uff08order 0\uff09\u548c\u670d\u52a1\u4fe1\u606f\uff08order 200\uff09\u4e4b\u95f4\u88ab\u6253\u51fa 2. \u521b\u5efaSPI\u6587\u4ef6 \u5728resources/META-INF/services\u4e2d\u521b\u5efa\u65b0\u7684SPI\u6587\u4ef6 \u540d\u5b57\uff1aorg.apache.servicecomb.core.bootup.BootUpInformationCollector \u5185\u5bb9\uff1a(HelloCollector\u7684\u7c7b\u540d) 3. \u8fd0\u884c\u6548\u679c <code>2019-08-21 16:37:14,859 [INFO] Service information is shown below: service center: [http://127.0.0.1:30100] config center: [http://127.0.0.1:30113] Hello! AppID: Restful-Service-HelloWorld ServiceName: restful_provider Version: 0.0.1 Environment: production ServiceID: a3344e9ad4557f883b36d7f53e33306fbc0a54ad InstanceID; e0765a8ec3ee11e9910d0255ac105780 org.apache.servicecomb.core.SCBEngine$1.afterRegistryInstance(SCBEngine.java:243)</code></p>"},{"location":"general-development/shutdown.html","title":"\u4f18\u96c5\u505c\u673a","text":"<p>ServiceComb\u662f\u901a\u8fc7JDK\u7684ShutdownHook\u6765\u5b8c\u6210\u4f18\u96c5\u505c\u673a\u7684\u3002</p>"},{"location":"general-development/shutdown.html#_2","title":"\u4f7f\u7528\u573a\u666f","text":"<p>\u4f18\u96c5\u505c\u673a\u53ef\u4ee5\u89e3\u51b3\u4ee5\u4e0b\u573a\u666f\uff1a * KILL PID * \u5e94\u7528\u610f\u5916\u81ea\u52a8\u9000\u51fa\uff08System.exit(n)\uff09</p> <p>\u4f18\u96c5\u505c\u673a\u89e3\u51b3\u4e0d\u4e86\u4ee5\u4e0b\u573a\u666f\uff1a * KILL -9 PID \u6216 taskkill /f /pid</p>"},{"location":"general-development/shutdown.html#_3","title":"\u6548\u679c","text":"<p>\u89e6\u53d1\u4f18\u96c5\u505c\u673a\u65f6\uff1a * \u670d\u52a1\u63d0\u4f9b\u8005\uff1a * \u6807\u8bb0\u5f53\u524d\u670d\u52a1\u72b6\u6001\u4e3aSTOPPING\uff0c\u4e0d\u63a5\u53d7\u65b0\u7684\u5ba2\u6237\u7aef\u8bf7\u6c42\uff0c\u65b0\u7684\u5ba2\u6237\u7aef\u8bbf\u95ee\u8bf7\u6c42\u4f1a\u5728\u5ba2\u6237\u7aef\u76f4\u63a5\u62a5\u9519\uff0c\u5ba2\u6237\u7aef\u914d\u5408\u91cd\u8bd5\u673a\u5236\u53ef\u91cd\u8bd5\u5176\u4ed6\u5b9e\u4f8b\uff1b * \u7b49\u5f85\u5f53\u524d\u5df2\u8fd0\u884c\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5\uff0c\u5982\u679c\u8bbe\u7f6e\u4e86provider\u7aef\u8d85\u65f6\uff0c\u8d85\u65f6\u5219\u5f3a\u5236\u5173\u95ed\uff1b * \u670d\u52a1\u6d88\u8d39\u8005\uff1a * \u6807\u8bb0\u5f53\u524d\u670d\u52a1\u72b6\u6001\u4e3aSTOPPING\uff0c\u76f4\u63a5\u62d2\u7edd\u65b0\u7684\u8c03\u7528\u8bf7\u6c42\uff1b * \u7b49\u5f85\u5f53\u524d\u5df2\u53d1\u9001\u8bf7\u6c42\u7684\u54cd\u5e94\uff0c\u5982\u679c\u8d85\u8fc7\u5ba2\u6237\u7aef\u63a5\u6536\u54cd\u5e94\u7684\u8d85\u65f6\u65f6\u95f4\uff08\u9ed8\u8ba430\u79d2\uff09\uff0c\u5219\u5f3a\u5236\u5173\u95ed\uff1b</p>"},{"location":"general-development/shutdown.html#_4","title":"\u539f\u7406","text":"<p>\u89e6\u53d1\u4f18\u96c5\u505c\u673a\u65f6\uff0c\u4f1a\u4f9d\u6b21\u6267\u884c\u4ee5\u4e0b\u6b65\u9aa4\uff1a 1. \u7ed9\u6240\u6709listener\u4e0b\u53d1BEFORE_CLOSE\u4e8b\u4ef6\uff0c\u901a\u77e5listener\u5904\u7406\u5bf9\u5e94\u4e8b\u4ef6\uff1b 2. \u5c06\u5f53\u524d\u670d\u52a1\u72b6\u6001\u6807\u8bb0\u4e3aSTOPPING\uff1b 3. \u4ece\u670d\u52a1\u4e2d\u5fc3\u6ce8\u9500\u5f53\u524d\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u5e76\u5173\u95edregistry\u5bf9\u5e94vertx\uff1b 4. \u7b49\u5f85\u6240\u6709\u5f53\u524d\u5df2\u5b58\u5728invocation\u8c03\u7528\u5b8c\u6210\uff1b 5. \u5173\u95edconfig-center\u548ctransport\u5bf9\u5e94vertx\uff1b 6. \u7ed9\u6240\u6709listener\u4e0b\u53d1AFTER_CLOSE\u4e8b\u4ef6\uff0c\u901a\u77e5listener\u5904\u7406\u5bf9\u5e94\u4e8b\u4ef6\uff1b 7. \u5c06\u5f53\u524d\u670d\u52a1\u72b6\u6001\u6807\u8bb0\u4e3aDOWN\uff1b\u4f18\u96c5\u505c\u673a\u7ed3\u675f\uff1b</p>"},{"location":"general-development/thread-model.html","title":"\u7ebf\u7a0b\u6a21\u578b","text":""},{"location":"general-development/thread-model.html#_2","title":"\u6982\u5ff5\u9610\u8ff0","text":"<p>\u672c\u5c0f\u8282\u4e3b\u8981\u4ecb\u7ecdserviceComb\u5fae\u670d\u52a1\u7684\u5b8c\u6574\u7ebf\u7a0b\u6a21\u578b </p>"},{"location":"general-development/thread-model.html#_3","title":"\u540c\u6b65\u6a21\u5f0f\u4e0b\u7684\u7ebf\u7a0b\u6a21\u578b","text":""},{"location":"general-development/thread-model.html#reactive","title":"reactive\u6a21\u5f0f\u4e0b\u7684\u7ebf\u7a0b\u6a21\u578b","text":"<p>\u7ebf\u7a0b\u76f8\u5173\u914d\u7f6e\uff1a </p> <ul> <li>REST over Vertx</li> <li>Highway</li> <li>\u540c\u6b65\u6a21\u5f0f\u4e0b\u670d\u52a1\u7aef\u4e1a\u52a1\u7ebf\u7a0b\u6c60</li> </ul>"},{"location":"general-development/upload-download.html","title":"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d","text":"<p>\u901a\u8fc7\u6d4f\u89c8\u5668\u4e0a\u4f20\u4e0b\u8f7d\u6587\u4ef6\uff0c\u662f\u975e\u5e38\u666e\u904d\u7684\u5e94\u7528\u573a\u666f\u3002java-chassis\u57fa\u4e8eREST\u63d0\u4f9b\u4e86\u4e0a\u4f20\u4e0b\u8f7d\u529f\u80fd\uff1a</p> <ul> <li>\u5728\u5b9a\u4e49\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u65f6\u5019\uff0c\u53ea\u5141\u8bb8\u91c7\u7528Spring MVC \u6216\u8005 Jax RS\u6a21\u5f0f\u3002 \u5f00\u53d1\u670d\u52a1\u6d88\u8d39\u8005\u4e0d\u53d7\u9650\u5236\uff0c\u53ef\u4ee5\u4f7f\u7528\u900f\u660eRPC\u6216\u8005RestTemplate\u3002</li> <li>\u5728\u5b9a\u4e49\u901a\u4fe1\u6a21\u578b\u7684\u65f6\u5019\uff0c\u53ea\u5141\u8bb8\u4f7f\u7528REST over Vert.x \u6216\u8005 REST over Servlet\uff0c\u4e0d\u80fd\u591f\u4f7f\u7528HIGHWAY\u534f\u8bae\u3002</li> <li>\u4e0a\u4f20\u4e0b\u8f7d\u6587\u4ef6\u529f\u80fd\u9ed8\u8ba4\u662f\u5173\u95ed\u7684\u3002\u9700\u8981\u914d\u7f6eservicecomb.uploads.directory\u542f\u7528\uff0c\u5982\u679c\u901a\u8fc7\u8fb9\u7f18\u670d\u52a1(Edge Service)\u8f6c\u53d1\u8bf7\u6c42\uff0c\u8fb9\u7f18\u670d\u52a1\u4e5f\u9700\u8981\u8fd9\u4e2a\u914d\u7f6e\u9879\u3002</li> <li>\u901a\u8fc7HTTP FORM\u7684\u65b9\u5f0f\u4e0a\u4f20\u6587\u4ef6\uff08\u4e00\u822c\u91c7\u7528POST\uff09\uff1b\u901a\u8fc7GET\u4e0b\u8f7d\u6587\u4ef6\u3002</li> </ul> <p>\u672c\u7ae0\u8282\u5305\u542b\u5982\u4e0b\u5185\u5bb9\uff1a</p> <ul> <li>\u6587\u4ef6\u4e0a\u4f20\u5f00\u53d1\u6307\u5bfc</li> <li>\u6587\u4ef6\u4e0b\u8f7d\u5f00\u53d1\u6307\u5bfc</li> </ul> <p>\u6ce8\u610f: \u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d\u4e0d\u652f\u6301\u65ad\u70b9\u7eed\u4f20\u7279\u6027\uff0c\u5982\u679c\u4e0a\u4f20\u4e0b\u8f7d\u5927\u6587\u4ef6\uff0c\u9700\u8981\u6ce8\u610f\u4e0a\u4f20\u4e0b\u8f7d\u65f6\u95f4\u9650\u5236\uff0c\u8d85\u65f6\u4f1a\u5bfc\u81f4\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d\u5931\u8d25\u3002</p>"},{"location":"general-development/using-inspector.html","title":"\u4f7f\u7528 inspector \u6a21\u5757\u67e5\u770b\u5951\u7ea6","text":"<p>inspector \u63d0\u4f9b\u4e86\u7528\u6237\u67e5\u770b\u3001\u4e0b\u8f7d\u5951\u7ea6\uff0c\u751f\u6210\u6587\u6863\u548c\u5bf9API\u63a5\u53e3\u8fdb\u884c\u6d4b\u8bd5\u7684\u529f\u80fd\u3002\u8fd9\u4e2a\u529f\u80fd\u76f4\u63a5\u5728\u5fae\u670d\u52a1\u63d0\u4f9b\uff0c\u7528\u4e8e\u5f25\u8865\u901a\u8fc7\u670d\u52a1\u4e2d\u5fc3\u67e5\u770b\u5951\u7ea6\u548c\u5bf9\u63a5\u53e3\u8fdb\u884c\u6d4b\u8bd5\u7684\u4e0d\u8db3\u3002inspector\u529f\u80fd\u540e\u7eed\u4f1a\u505a\u8fdb\u4e00\u6b65\u589e\u5f3a\uff0c\u9664\u4e86\u7ba1\u7406\u5951\u7ea6\uff0c\u8fd8\u53ef\u4ee5\u89c2\u5bdf\u5fae\u670d\u52a1\u7684\u5185\u90e8\u72b6\u6001\uff0c\u5e2e\u52a9\u5b9a\u4f4d\u4e00\u4e9b\u5e38\u89c1\u95ee\u9898\u3002</p>"},{"location":"general-development/using-inspector.html#inspector_1","title":"\u542f\u7528inspector","text":"<p>\u5728\u9879\u76ee\u4e2d\u542f\u7528inspector\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u8981\u5728pom\u4e2d\u589e\u52a0\u5982\u4e0b\u4f9d\u8d56\u5373\u53ef\u3002 </p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;inspector&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>\u5982\u679c\u9879\u76ee\u4e2d\u4f9d\u8d56\u4e86 solution-basic , \u8fd9\u4e2a\u6a21\u5757\u4f1a\u81ea\u52a8\u5305\u542b\u8fdb\u6765\u3002</p> <p>\u5f15\u5165\u4f9d\u7136\u540e\u542f\u52a8\u5fae\u670d\u52a1\u5373\u53ef\u4f7f\u7528\u76f8\u5173\u5951\u7ea6\u7ba1\u7406\u529f\u80fd\u3002\u4e0b\u9762\u5047\u8bbe\u5fae\u670d\u52a1\u76d1\u542c\u7684\u7aef\u53e3\u4e3a8080\u3002</p>"},{"location":"general-development/using-inspector.html#inspector_2","title":"\u4f7f\u7528inspector\u529f\u80fd","text":"<p>inspector\u63d0\u4f9b\u4e86\u7ba1\u7406\u754c\u9762\uff0c\u96c6\u6210\u4e86swagger\u7f16\u8f91\u5668\u3002\u8f93\u5165 http://localhost:8080/inspector/index.html \u540e\uff0c\u51fa\u73b0\u5982\u4e0b\u754c\u9762\u3002</p> <p>SWAGER\u7f16\u8f91\u754c\u9762</p> <p></p> <p>\u5728SWAGGER\u7f16\u8f91\u754c\u9762\uff0c\u53ef\u4ee5\u5bf9\u63a5\u53e3\u8fdb\u884c\u6d4b\u8bd5\u3002</p> <p>HTML\u754c\u9762</p> <p></p> <p>HTML\u9875\u9762\u63d0\u4f9b\u4e86\u66f4\u5bb9\u6613\u8bfb\u5199\u7684\u683c\u5f0f\uff0c\u65b9\u4fbf\u5f00\u53d1\u8005\u67e5\u770b\u63a5\u53e3\u8bf4\u660e\u3002</p> <p>\u8f93\u5165 http://localhost:8080/inspector/schemas \u53ef\u4ee5\u67e5\u8be2\u6240\u6709\u7684schema\u5217\u8868</p> <pre><code>[\"goodsRepositoryApi\",\"goodsService\",\"onlineMallApi\",\"stockApi\",\"goodsCategoryApi\",\"goodsPriceApi\"]\n</code></pre> <p>\u8f93\u5165 <code>http://localhost:8080/inspector/download/schemas?format=HTML</code> \u53ef\u4ee5\u4e0b\u8f7d\u6587\u6863\u3002format\u652f\u6301HTML\u548cSWAGGER\u4e24\u79cd\u683c\u5f0f\u3002\u8fd9\u4e2a\u63a5\u53e3\u4f1a\u4e0b\u8f7d\u6240\u6709\u5951\u7ea6\u6587\u4ef6\uff0c\u6253\u5305\u4e3azip\u683c\u5f0f\u3002</p> <p>\u8f93\u5165 <code>http://localhost:8080/inspector/schemas/goodsService?download=false&amp;format=HTML</code> \u53ef\u4ee5\u67e5\u770b\u3001\u4e0b\u8f7d\u5355\u4e2a\u5951\u7ea6\u6587\u4ef6\u3002</p>"},{"location":"general-development/using-inspector.html#inspector_3","title":"\u4fdd\u62a4 inspector \u63a5\u53e3\u7684\u8bbf\u95ee\u63a7\u5236","text":"<p>\u8be5\u529f\u80fd\u88ab\u8bbe\u8ba1\u4e3a\u8f85\u52a9\u5f00\u53d1\u3001\u8bbe\u8ba1\u3001\u8fd0\u7ef4\uff0c\u7b2c\u4e00\u6b21\u8bbf\u95ee\u7684\u65f6\u5019\u52a0\u8f7d\u5f88\u6162\uff0c\u4e0d\u5efa\u8bae\u5f00\u653e\u7ed9\u6700\u7ec8\u7528\u6237\u5927\u89c4\u6a21\u5e76\u53d1\u8bbf\u95ee\u4f7f\u7528\u3002 \u5982\u679c\u5728\u751f\u4ea7\u73af\u5883\u5e26\u5165 \u8fd9\u4e2a\u529f\u80fd\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fc5\u8981\u7684\u9694\u79bb\u63aa\u65bd\u548c\u8bbf\u95ee\u63a7\u5236\uff0c\u9650\u5236\u6700\u7ec8\u7528\u6237\u5bf9\u4e8e\u8fd9\u4e2a\u63a5\u53e3\u7684\u8bbf\u95ee\u3002</p> <p>\u53ef\u4ee5\u4f7f\u7528 java-chassis \u63d0\u4f9b\u7684\u7ebf\u7a0b\u6c60\u9694\u79bb\u529f\u80fd\uff0c \u5c06\u8fd9\u4e2a\u670d\u52a1\u653e\u5230\u72ec\u7acb\u7684\u7ebf\u7a0b\u6c60\uff0c\u907f\u514d\u5bf9\u5176\u4ed6\u670d\u52a1\u7684\u8bbf\u95ee\u4ea7\u751f\u5f71\u54cd\u3002\u5177\u4f53\u64cd\u4f5c\u6b65\u9aa4\u5305\u62ec\uff0c</p> <p>\u5b9a\u4e49\u7ebf\u7a0b\u6c60\uff1a</p> <pre><code> &lt;bean id=\"servicecomb.samples.executor.groupThreadPool\" class=\"org.apache.servicecomb.core.executor.GroupExecutor\"\n init-method=\"init\"/&gt;\n</code></pre> <p>\u542f\u7528\u7ebf\u7a0b\u6c60:</p> <pre><code>servicecomb:\n executors:\n Provider:\n inspector: servicecomb.samples.executor.groupThreadPool\n</code></pre>"},{"location":"question-and-answer/faq.html","title":"\u5e38\u89c1\u95ee\u9898","text":"<ul> <li>Q: \u5951\u7ea6\u751f\u6210\u4f1a\u62a5\u9519 Caused by: java.lang.Error: OperationId must be unique\uff0c\u4e0d\u652f\u6301\u51fd\u6570\u91cd\u8f7d\uff1f </li> <li>Q: Map\u7c7b\u578b\u7684key\u5fc5\u987b\u4f7f\u7528 String \u7c7b\u578b\uff1f </li> <li>Q: \u53c2\u6570\u8fd4\u56de\u503c\u4e0d\u80fd\u4f7f\u7528\u63a5\u53e3\uff1f</li> <li>Q: \u53c2\u6570\u8fd4\u56de\u503c\u4e0d\u80fd\u4f7f\u7528\u6cdb\u578b\uff1f</li> <li>Q: \u5b9e\u73b0\u7c7b\u4e2d public \u65b9\u6cd5\u5168\u90e8\u88ab\u53d1\u5e03\u4e3a\u63a5\u53e3\uff0c\u5982\u4f55\u6392\u9664\uff1f</li> <li>Q: \u5982\u4f55\u81ea\u5b9a\u4e49\u67d0\u4e2aJava\u65b9\u6cd5\u5bf9\u5e94\u7684REST\u63a5\u53e3\u91cc\u7684HTTP Status Code\uff1f</li> </ul>"},{"location":"question-and-answer/faq.html#Q2","title":"Q: \u5951\u7ea6\u751f\u6210\u4f1a\u62a5\u9519 Caused by: java.lang.Error: OperationId must be unique\uff0c\u4e0d\u652f\u6301\u51fd\u6570\u91cd\u8f7d\uff1f","text":"<ul> <li>A: \u652f\u6301\u51fd\u6570\u91cd\u8f7d\uff0c\u4f46\u662f\u9700\u8981\u6ce8\u610f\u6bcf\u4e2a\u63a5\u53e3\u5fc5\u987b\u6709\u552f\u4e00\u7684operation id\u3002\u53ef\u4ee5\u52a0\u4e0a<code>@ApiOperation</code>\u6807\u7b7e\u7ed9\u91cd\u8f7d\u7684\u63a5\u53e3\u6307\u5b9a\u552f\u4e00 \u7684 operation id (\u5bf9\u5e94\u4e8e nickname \u5c5e\u6027\uff09\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a</li> </ul> <pre><code> @Path(\"/sayHi\")\n @GET\n @Produces(\"text/plain;charset=UTF-8\")\n @ApiOperation(value = \"\", nickname = \"sayHi\")\n public String sayHello() {\n return \"ApiOperationJaxrsSchema#sayHello\";\n }\n\n @Path(\"/sayHello\")\n @GET\n @Produces(\"application/json;charset=UTF-8\")\n @ApiOperation(value = \"\", nickname = \"sayHello\")\n public String sayHello(@ApiParam(\"name\") String name) {\n return name;\n }\n</code></pre>"},{"location":"question-and-answer/faq.html#Q3","title":"Q: Map\u7c7b\u578b\u7684 key \u5fc5\u987b\u4f7f\u7528 String \u7c7b\u578b\uff1f","text":"<ul> <li>A: \u662f\u7684\u3002java-chassis \u9075\u5faa Open API \u89c4\u8303, MAP \u7c7b\u578b\u7684 key \u5fc5\u987b\u4f7f\u7528 String \u7c7b\u578b\u3002 \u4e1a\u52a1\u53ef\u4ee5\u7ed3\u5408\u5b9e\u9645\u60c5\u51b5\uff0c\u4f7f\u7528\u7b26\u5408\u89c4\u8303\u7684\u7c7b\u578b\u3002 \u5982\u679c\u5fc5\u987b\u4f7f\u7528\u5176\u4ed6\u7c7b\u578b\uff0c \u53ef\u4ee5\u8003\u8651\u63a5\u53e3\u5b9a\u4e49\u4f7f\u7528 Object \u89c4\u907f\uff0c\u5ba2\u6237\u7aef\u53ef\u4ee5\u5bf9\u8fd4\u56de\u503c\u7ed3\u679c\u81ea\u884c\u8fdb\u884c json \u8f6c\u6362\u3002</li> </ul>"},{"location":"question-and-answer/faq.html#Q4","title":"Q: \u53c2\u6570\u8fd4\u56de\u503c\u4e0d\u80fd\u4f7f\u7528\u63a5\u53e3\uff1f","text":"<ul> <li>A: \u662f\u7684\u3002java-chassis \u4e0d\u5141\u8bb8\u53c2\u6570\u3001\u8fd4\u56de\u503c\u7684\u7c7b\u578b\u4e3a <code>Interface</code> \u6216\u8005 <code>Abstract Class</code>\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7c7b\u578b \u65e0\u6cd5\u6b63\u786e\u7684\u751f\u6210 swagger \u63cf\u8ff0\u3002\u5982\u679c\u5fc5\u987b\u4f7f\u7528\u8fd9\u4e9b\u7c7b\u578b\uff0c\u53ef\u4ee5\u8003\u8651\u63a5\u53e3\u5b9a\u4e49\u4f7f\u7528 Object \u89c4\u907f\uff0c\u5ba2\u6237\u7aef\u53ef\u4ee5\u5bf9\u8fd4\u56de\u503c\u7ed3\u679c \u81ea\u884c\u8fdb\u884c json \u8f6c\u6362\u3002</li> </ul>"},{"location":"question-and-answer/faq.html#Q5","title":"Q: \u53c2\u6570\u8fd4\u56de\u503c\u4e0d\u80fd\u4f7f\u7528\u6cdb\u578b\uff1f","text":"<ul> <li>A: \u53ef\u4ee5\u4f7f\u7528\u6cdb\u578b\u3002\u4f46\u662f\u5fc5\u987b\u660e\u786e\u6cdb\u578b\u7c7b\u578b\u3002\u6bd4\u5982\uff1a</li> </ul> <pre><code> @PostMapping(path = \"holderUser\")\n public Holder&lt;User&gt; holderUser(@RequestBody Holder&lt;User&gt; input) {\n Assert.isInstanceOf(Holder.class, input);\n Assert.isInstanceOf(User.class, input.value);\n return input;\n }\n\n @GetMapping(path = \"/genericParams\")\n @ApiOperation(value = \"genericParams\", nickname = \"genericParams\")\n public List&lt;List&lt;String&gt;&gt; genericParams(@RequestParam(\"code\") int code, @RequestBody List&lt;List&lt;String&gt;&gt; names) {\n return names;\n }\n</code></pre> <p>\u672a\u6307\u5b9a\u6cdb\u578b\u7c7b\u578b\u662f\u4e0d\u5141\u8bb8\u7684\u3002\u6bd4\u5982\uff1a</p> <pre><code> @GetMapping(path = \"/genericParams\")\n @ApiOperation(value = \"genericParams\", nickname = \"genericParams\")\n public List genericParams(@RequestParam(\"code\") int code, @RequestBody List names) {\n return names;\n }\n</code></pre> <p>\u5982\u679c\u4e1a\u52a1\u5fc5\u987b\u4f7f\u7528\u6cdb\u578b\uff0c\u5e76\u4e14\u4e0d\u80fd\u786e\u5b9a\u7c7b\u578b\uff0c\u53ef\u4ee5\u8003\u8651\u63a5\u53e3\u5b9a\u4e49\u4f7f\u7528 Object \u89c4\u907f\uff0c\u5ba2\u6237\u7aef\u53ef\u4ee5\u5bf9\u8fd4\u56de\u503c\u7ed3\u679c \u81ea\u884c\u8fdb\u884c json \u8f6c\u6362\u3002</p>"},{"location":"question-and-answer/faq.html#Q6","title":"Q: \u5b9e\u73b0\u7c7b\u4e2d public \u65b9\u6cd5\u5168\u90e8\u88ab\u53d1\u5e03\u4e3a\u63a5\u53e3\uff0c\u5982\u4f55\u6392\u9664\uff1f","text":"<ul> <li>A: java chassis \u4f1a\u5c06\u6240\u6709 public \u65b9\u6cd5\u53d1\u5e03\u4e3a\u63a5\u53e3\u3002 \u5982\u679c\u6709\u4e9b\u63a5\u53e3\u4e0d\u9700\u8981\u53d1\u5e03\u4e3a\u63a5\u53e3\uff0c\u53ef\u4ee5\u4f7f\u7528 @ApiOperation \u6807\u7b7e\u58f0\u660e\u4e0d\u53d1\u5e03\u4e3a\u63a5\u53e3\u3002\u4f8b\u5b50\u5982\u4e0b\uff1a</li> </ul> <pre><code> @ApiOperation(value = \"\", hidden = true)\n public void hidden() {\n\n }\n</code></pre> <p>\u5728\u8fc1\u79fb\u6539\u9020\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6bd4\u5982\u5c06 HSF \u548c Dubbo \u7684\u5185\u90e8 RPC \u63a5\u53e3\u6539\u9020\u4e3a java-chassis \u7684 RPC \u63a5\u53e3\uff0c\u53ef\u80fd\u8fd8\u6709\u66f4\u52a0\u590d\u6742 \u7684\u60c5\u51b5\uff0c\u6bd4\u5982\uff1a</p> <pre><code>@HSFProvider(MyInterface.class)\npublic MyService extends AbstractMyService implements MyInterface\n</code></pre> <p>\u5982\u679c\u76f4\u63a5\u6539\u9020\u4e3a</p> <pre><code>@RpcSchema(schemaId = \"MyService\")\npublic MyService extends AbstractMyService implements MyInterface\n</code></pre> <p>\u90a3\u4e48 <code>AbstractMyService</code> \u7684\u516c\u5171\u65b9\u6cd5\u4e5f\u4f1a\u53d1\u5e03\u4e3a RPC \u63a5\u53e3\uff0c \u800c HSF \u548c dubbo \u5219\u4e0d\u4f1a\u3002 \u8fd9\u79cd\u60c5\u51b5\u5efa\u8bae\u589e\u52a0 \u4e00\u4e2a\u7c7b\uff0c\u800c\u5c06\u539f\u6765\u7684\u63a5\u53e3\u58f0\u660e\u4e3a\u670d\u52a1\u7c7b\u6765\u5904\u7406\uff0c \u6bd4\u5982\uff1a</p> <pre><code>@Service(\"MyService\")\npublic MyService extends AbstractMyService implements MyInterface\n\n@RpcSchema(schemaId = \"MyServiceImpl\")\npublic MyServiceImpl implements MyInterface {\n @Autowired\n @Qualifier(\"MyService\")\n MyInterface service;\n\n public String hello(String name) {\n return service.hello(name);\n }\n}\n</code></pre>"},{"location":"question-and-answer/faq.html#Q7","title":"Q: \u5982\u4f55\u81ea\u5b9a\u4e49\u67d0\u4e2aJava\u65b9\u6cd5\u5bf9\u5e94\u7684REST\u63a5\u53e3\u91cc\u7684HTTP Status Code\uff1f","text":"<ul> <li>A: \u5bf9\u4e8e 2xx \u7684\u8fd4\u56de\u503c\uff0c\u53ef\u4ee5\u901a\u8fc7 @ApiResponse \u5b9e\u73b0\uff0c\u4f8b\u5982\uff1a</li> </ul> <pre><code>@ApiResponse(code = 201, response = Integer.class, message = \"\")\npublic int test(int x) {\n return 100;\n}\n</code></pre> <p>\u5bf9\u4e8e\u5176\u4ed6\u8fd4\u56de\u503c\uff0c\u53ef\u4ee5\u901a\u8fc7\u629b\u51fa\u81ea\u5b9a\u4e49\u7684 InvocationException \u5b9e\u73b0\uff0c\u4f8b\u5982\uff1a</p> <pre><code>@Path(\"/errorCode\")\n@POST\n@ApiResponses({\n @ApiResponse(code = 200, response = MultiResponse200.class, message = \"\"),\n @ApiResponse(code = 400, response = MultiResponse400.class, message = \"\"),\n @ApiResponse(code = 500, response = MultiResponse500.class, message = \"\")})\npublic MultiResponse200 errorCode(MultiRequest request) {\n if (request.getCode() == 400) {\n MultiResponse400 r = new MultiResponse400();\n r.setCode(400);\n r.setMessage(\"bad request\");\n throw new InvocationException(javax.ws.rs.core.Response.Status.BAD_REQUEST, r);\n } else if (request.getCode() == 500) {\n MultiResponse500 r = new MultiResponse500();\n r.setCode(500);\n r.setMessage(\"internal error\");\n throw new InvocationException(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, r);\n } else {\n MultiResponse200 r = new MultiResponse200();\n r.setCode(200);\n r.setMessage(\"success result\");\n return r;\n }\n}\n</code></pre> <ul> <li> <p>Q: \u5982\u4f55\u5b9a\u5236\u81ea\u5df1\u5fae\u670d\u52a1\u7684\u65e5\u5fd7\u914d\u7f6e?</p> <ul> <li>A: ServiceComb\u4e0d\u7ed1\u5b9a\u65e5\u5fd7\u5668\uff0c\u53ea\u662f\u4f7f\u7528\u4e86slf4j\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u7531\u9009\u62e9log4j/log4j2/logback\u7b49\u7b49\u3002ServiceComb\u63d0\u4f9b\u4e86\u4e00\u4e2alog4j\u7684\u6269\u5c55\uff0c\u5728\u6807\u51c6log4j\u7684\u57fa\u7840\u4e0a\uff0c\u652f\u6301log4j\u7684properties\u6587\u4ef6\u7684\u589e\u91cf\u914d\u7f6e\u3002<ul> <li>\u9ed8\u8ba4\u4ee5\u89c4\u5219\uff1a\"classpath*:config/log4j.properties\"\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6</li> <li>\u5b9e\u9645\u4f1a\u641c\u7d22\u51faclasspath\u4e2d\u6240\u6709\u7684<code>config/log4j.properties\u548cconfig/log4j.*.properties</code>, \u4ece\u641c\u7d22\u51fa\u7684\u6587\u4ef6\u4e2d\u5207\u51fa<code>\\*</code>\u7684\u90e8\u5206\uff0c\u8fdb\u884calpha\u6392\u5e8f\uff0c\u7136\u540e\u6309\u987a\u5e8f\u52a0\u8f7d\uff0c\u6700\u540e\u5408\u6210\u7684\u6587\u4ef6\u4f5c\u4e3alog4j\u7684\u914d\u7f6e\u6587\u4ef6\u3002</li> <li>\u5982\u679c\u8981\u4f7f\u7528ServiceComb\u7684log4j\u6269\u5c55\uff0c\u5219\u9700\u8981\u8c03\u7528Log4jUtils.init\uff0c\u5426\u5219\u5b8c\u5168\u6309\u6807\u51c6\u7684\u65e5\u5fd7\u5668\u7684\u89c4\u5219\u4f7f\u7528\u3002</li> </ul> </li> </ul> </li> <li> <p>Q: \u5f53\u670d\u52a1\u914d\u7f6e\u4e86\u591a\u4e2atransport\u7684\u65f6\u5019\uff0c\u5728\u8fd0\u884c\u65f6\u662f\u600e\u4e48\u9009\u62e9\u4f7f\u7528\u54ea\u4e2atransport\u7684\uff1f</p> <ul> <li> <p>A: ServiceComb\u7684consumer\u3001transport\u3001handler\u3001producer\u4e4b\u95f4\u662f\u89e3\u8026\u7684\uff0c\u5404\u529f\u80fd\u4e4b\u95f4\u901a\u8fc7\u5951\u7ea6\u5b9a\u4e49\u8054\u5408\u5728\u4e00\u8d77\u5de5\u4f5c\u7684\uff0c\u5373\uff1a consumer\u4f7f\u7528\u900f\u660erpc\uff0c\u8fd8\u662fspringmvc\u5f00\u53d1\u4e0e\u4f7f\u7528highway\uff0c\u8fd8\u662fRESTful\u5728\u7f51\u7edc\u4e0a\u4f20\u8f93\u6ca1\u6709\u5173\u7cfb\u4e0eproducer\u662f\u4f7f\u7528\u900f\u660erpc\uff0c\u8fd8\u662fjaxrs\uff0c \u6216\u8005\u662fspringmvc\u5f00\u53d1\uff0c\u4e5f\u6ca1\u6709\u5173\u7cfbhandler\u4e5f\u4e0d\u611f\u77e5\uff0c\u4e1a\u52a1\u5f00\u53d1\u65b9\u5f0f\u4ee5\u53ca\u4f20\u8f93\u65b9\u5f0f\u3002consumer\u8bbf\u95eeproducer\uff0c\u5728\u8fd0\u884c\u65f6\u7684transport\u9009\u62e9\u4e0a\uff0c \u603b\u89c4\u5219\u4e3a\uff1acnsumer\u7684transport\u4e0eproducer\u7684endpoint\u53d6\u4ea4\u96c6\uff0c\u5982\u679c\u4ea4\u96c6\u540e\uff0c\u8fd8\u6709\u591a\u4e2atransport\u53ef\u9009\u62e9\uff0c\u5219\u8f6e\u6d41\u4f7f\u7528\uff0c\u5206\u89e3\u5f00\u6765\uff0c\u5b58\u5728\u4ee5\u4e0b\u573a\u666f\uff1a</p> <ul> <li> <p>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1producer\u540c\u65f6\u5f00\u653e\u4e86highway\u4ee5\u53caRESTful\u7684endpoint</p> <ul> <li>consumer\u8fdb\u7a0b\u4e2d\u53ea\u90e8\u7f72\u4e86highway transport jar\uff0c\u5219\u53ea\u4f1a\u8bbf\u95eeproducer\u7684highway endpoint</li> <li>consumer\u8fdb\u7a0b\u4e2d\u53ea\u90e8\u7f72\u4e86RESTful transport jar\uff0c\u5219\u53ea\u4f1a\u8bbf\u95eeproducer\u7684RESTful endpoint</li> <li>consumer\u8fdb\u7a0b\u4e2d\uff0c\u540c\u65f6\u90e8\u7f72\u4e86highway\u548cRESTful transport jar\uff0c\u5219\u4f1a\u8f6e\u6d41\u8bbf\u95eeproducer\u7684highway\u3001RESTful endpoint</li> </ul> </li> <li> <p>\u5982\u679cconsumer\u60f3\u56fa\u5b9a\u4f7f\u7528\u67d0\u4e2atransport\u8bbf\u95eeproducer\uff0c\u53ef\u4ee5\u5728consumer\u8fdb\u7a0b\u7684microservice.yaml\u4e2d\u914d\u7f6e\uff0c\u6307\u5b9atransport\u7684\u540d\u79f0:</p> <pre><code>servicecomb:\n references:\n &lt;service_name&gt;:\n transport: highway\n</code></pre> </li> <li> <p>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1producer\u53ea\u5f00\u653e\u4e86highway\u7684endpoint</p> <ul> <li>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86highway transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528highway\u8bbf\u95ee</li> <li>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86RESTful transport jar\uff0c\u5219\u65e0\u6cd5\u8bbf\u95ee</li> <li>consumer\u8fdb\u7a0b\u540c\u65f6\u90e8\u7f72\u4e86highway\u548cRESTful transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528highway\u8bbf\u95ee</li> </ul> </li> <li> <p>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1producer\u53ea\u5f00\u653e\u4e86RESTful\u7684endpoint</p> <ul> <li>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86highway transport jar\uff0c\u5219\u65e0\u6cd5\u8bbf\u95ee</li> <li>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86RESTful transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528RESTful\u8bbf\u95ee</li> <li>consumer\u8fdb\u7a0b\u540c\u65f6\u90e8\u7f72\u4e86highway\u548cRESTful transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528RESTful\u8bbf\u95ee</li> </ul> </li> </ul> </li> </ul> </li> <li> <p>Q: ServiceComb\u5fae\u670d\u52a1\u6846\u67b6\u670d\u52a1\u8c03\u7528\u662f\u5426\u4f7f\u7528\u957f\u8fde\u63a5?</p> <ul> <li>A: http\u4f7f\u7528\u7684\u662f\u957f\u8fde\u63a5\uff08\u6709\u8d85\u65f6\u65f6\u95f4\uff09\uff0chighway\u65b9\u5f0f\u4f7f\u7528\u7684\u662f\u957f\u8fde\u63a5\uff08\u4e00\u76f4\u4fdd\u6301\uff09\u3002</li> </ul> </li> <li> <p>Q: \u670d\u52a1\u65ad\u8fde\u670d\u52a1\u4e2d\u5fc3\u6ce8\u518c\u4fe1\u606f\u662f\u5426\u81ea\u52a8\u5220\u9664</p> <ul> <li>A: \u670d\u52a1\u4e2d\u5fc3\u5fc3\u8df3\u68c0\u6d4b\u5230\u670d\u52a1\u5b9e\u4f8b\u4e0d\u53ef\u7528\uff0c\u53ea\u4f1a\u79fb\u9664\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\uff0c\u670d\u52a1\u7684\u9759\u6001\u6570\u636e\u4e0d\u4f1a\u79fb\u9664\u3002</li> </ul> </li> <li> <p>Q: \u5982\u679c\u4f7f\u7528tomcat\u65b9\u5f0f\u96c6\u6210ServiceComb\u5fae\u670d\u52a1\u6846\u67b6\uff0c\u5982\u4f55\u5b9e\u73b0\u670d\u52a1\u6ce8\u518c</p> <ul> <li>A: \u5982\u679c\u4f7f\u7528ServiceComb sdk servlet\u65b9\u5f0f\uff08\u4f7f\u7528transport-rest-servlet\u4f9d\u8d56\uff09\u5236\u4f5c\u4e3awar\u5305\u90e8\u7f72\u5230tomcat\uff0c\u9700\u8981\u4fdd\u8bc1\uff0c \u670d\u52a1\u63cf\u8ff0\u6587\u4ef6\uff08microservice.yaml\uff09\u4e2drest\u7aef\u53e3\u914d\u7f6e\u548c\u5916\u7f6e\u5bb9\u5668\u4e00\u81f4\u624d\u80fd\u5b9e\u73b0\u8be5\u670d\u52a1\u7684\u6b63\u786e\u6ce8\u518c\u3002\u5426\u5219\u65e0\u6cd5\u611f\u77e5tomcat\u5f00\u653e\u7aef\u53e3\u3002</li> </ul> </li> <li> <p>Q: \u5982\u679c\u4f7f\u7528tomcat\u65b9\u5f0f\u96c6\u6210ServiceComb\u5fae\u670d\u52a1\u6846\u67b6\uff0c\u670d\u52a1\u6ce8\u518c\u7684\u65f6\u5019\u5982\u4f55\u5c06war\u5305\u90e8\u7f72\u7684\u4e0a\u4e0b\u6587\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3</p> <ul> <li>A: \u53d1\u5e03\u670d\u52a1\u63a5\u53e3\u7684\u65f6\u5019\u9700\u8981\u5c06war\u5305\u90e8\u7f72\u7684\u4e0a\u4e0b\u6587\uff08context\uff09\u653e\u5728baseurl\u6700\u524d\u9762\uff0c\u8fd9\u6837\u624d\u80fd\u4fdd\u8bc1\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u7684\u8def\u5f84\u662f\u5b8c\u6574\u7684\u8def\u5f84\uff08\u5305\u542b\u4e86\u4e0a\u4e0b\u6587\uff09\u3002\u793a\u4f8b\uff1a<pre><code>@path(/{context}/xxx)\nclass ServiceA\n</code></pre> </li> </ul> </li> <li> <p>Q: ServiceComb\u5fae\u670d\u52a1\u6846\u67b6\u5982\u4f55\u5b9e\u73b0\u6570\u636e\u591a\u4e2a\u5fae\u670d\u52a1\u95f4\u900f\u4f20</p> <ul> <li> <p>A: \u900f\u4f20\u6570\u636e\u585e\u5165\uff1a</p> <pre><code>CseHttpEntity&lt;xxxx.class&gt; httpEntity = new CseHttpEntity&lt;&gt;(xxx);\n//\u900f\u4f20\u5185\u5bb9\nhttpEntity.addContext(\"contextKey\",\"contextValue\");\nResponseEntity&lt;String&gt; responseEntity = RestTemplateBuilder.create()\n .exchange(\"cse://springmvc/springmvchello/sayhello\",HttpMethod.POST,httpEntity,String.class);\n</code></pre> <p>\u900f\u4f20\u6570\u636e\u83b7\u53d6\uff1a</p> <pre><code>@Override\n@RequestMapping(path=\"/sayhello\",method = RequestMethod.POST)\npublic String sayHello(@RequestBody Person person,InvocationContext context){\n //\u900f\u4f20\u6570\u636e\u83b7\u53d6\n context.getContext();\n return \"Hello person \" + person.getName();\n}\n</code></pre> </li> </ul> </li> <li> <p>Q: ServiceComb body Model\u90e8\u5206\u66b4\u9732</p> <ul> <li>A: \u4e00\u4e2a\u63a5\u53e3\u5bf9\u5e94\u7684body\u5bf9\u8c61\u4e2d\uff0c\u53ef\u80fd\u6709\u4e00\u4e9b\u5c5e\u6027\u662f\u5185\u90e8\u7684\uff0c\u4e0d\u60f3\u5f00\u653e\u51fa\u53bb\uff0c\u751f\u6210schema\u7684\u65f6\u5019\u4e0d\u8981\u5e26\u51fa\u53bb\uff0c\u4f7f\u7528\uff1a<pre><code>@ApiModelProperty(hidden = true)\n</code></pre> </li> </ul> </li> <li> <p>Q: \u670d\u52a1\u8d85\u65f6\u8bbe\u7f6e</p> <ul> <li>A: \u5728\u5fae\u670d\u52a1\u63cf\u8ff0\u6587\u4ef6\uff08microservice.yaml\uff09\u4e2d\u6dfb\u52a0\u5982\u4e0b\u914d\u7f6e\uff1a<pre><code>servicecomb:\n request:\n timeout: 30000\n</code></pre> </li> </ul> </li> <li> <p>Q: URL \u5730\u5740\u5c31\u53ef\u4ee5\u552f\u4e00\u5b9a\u4f4d\uff0c\u4e3a\u4ec0\u4e48\u8981\u52a0\u4e0a\u4e00\u4e2aschema\uff1f</p> <ul> <li>A: <ol> <li>schema \u662f\u7528\u6765\u5339\u914d\u670d\u52a1\u5951\u7ea6\u7684\uff0c\u7528\u6765\u4fdd\u8bc1\u670d\u52a1\u7aef\u548c\u6d88\u8d39\u7aef\u5951\u7ea6\u517c\u5bb9\uff0c\u6bcf\u4e2a\u5951\u7ea6\u9700\u8981\u4e00\u4e2a\u552f\u4e00ID\uff0c\u5728\u670d\u52a1\u4e2d\u5fc3\u5b58\u50a8\u3002</li> <li>schema\u6620\u5c04\u5230java\u7684interface\u6982\u5ff5\uff0c\u5728consumer\u4f7f\u7528\u900f\u660erpc\u6a21\u5f0f\u5f00\u53d1\u65f6\uff0c\u53ef\u4ee5\u627e\u5230\u662f\u5fae\u670d\u52a1\u91cc\u7684\u54ea\u4e2aoperation\u3002schema\u4e4b\u95f4\u7684\u65b9\u6cd5\u540d\u662f\u6ca1\u6709\u552f\u4e00\u6027\u8981\u6c42\u7684\u3002</li> <li>operation qualified name\u662f\u6cbb\u7406\u7684key\uff0c\u800cURL \u56e0\u4e3apath\u53c2\u6570\u7684\u5b58\u5728\uff0c\u6ca1\u529e\u6cd5\u76f4\u63a5\u67e5\u627e\uff0c\u800cqualified name\u662f\u4e0d\u4f1a\u53d8\u7684\u3002\u6cbb\u7406\u662f\u4e0d\u533a\u5206\u4f20\u8f93\u7684\uff0c\u5982\u679c\u6cbb\u7406\u6309URL \u8d70\uff0c\u90a3\u4e48highway\u8c03\u8fdb\u6765\u65f6\uff0c\u8fd8\u5f97\u6839\u636e\u53c2\u6570\u53cd\u5411\u6784\u9020\u51faurl\uff0c\u518d\u6765\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\uff0c\u592a\u6298\u817e\u4e86\u3002</li> <li>http\u53ea\u662f\u4e00\u79cd\u4f20\u8f93\u901a\u9053\uff0c\u8fd8\u6709\u522b\u7684\u4f20\u8f93\u901a\u9053\u4e0d\u9700\u8981\u6620\u5c04\u5230URL\u7684\u3002</li> </ol> </li> </ul> </li> <li> <p>Q: rest\u5ba2\u6237\u7aef\u8c03\u7528\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u4e0a\u53ea\u5e26\u4e0a\u4e86\u670d\u52a1\u540d\u548cURL\uff0c\u5e76\u4e0d\u9700\u8981\u6307\u5b9aschema id\u7684\uff0c \u800c\u5b9e\u9645\u4e0a\u6839\u636e\u8fd9\u4e2aURL\u4e5f\u80fd\u627e\u5230\u5177\u4f53\u5951\u7ea6\u7684\uff0c\u6240\u4ee5\u6307\u5b9aschema id\u4f5c\u7528\u4f55\u5728\uff1f</p> <ul> <li>A: \u7531\u4e8e\u900f\u660erpc\u662f\u63a5\u53e3\u5f0f\u8c03\u7528\uff0c\u5e76\u6ca1\u6709URL\uff0c\u5185\u90e8\u5b9e\u9645\u90fd\u5f52\u4e00\u5316\u5230operation\u6765\u63cf\u8ff0\u7684\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u7ed3\u5408schema id\u552f\u4e00\u5b9a\u4f4d\u5230\u5177\u4f53\u7684\u8bf7\u6c42\u5904\u7406\u4e2d\u3002</li> </ul> </li> <li> <p>Q: Transport\u662f\u4e2a\u4ec0\u4e48\u6982\u5ff5\uff1f\u7528\u6765\u5e72\u4ec0\u4e48\u7684\uff1f</p> <ul> <li>A: transport\u8d1f\u8d23\u7f16\u89e3\u7801\uff0c\u4ee5\u53ca\u4f20\u8f93\u3002\u901a\u4fe1\u6a21\u578b\u6709rest\u548chighway\u4e24\u79cd\uff0chighway\u5bf9\u5e94\u7684\u662f\u79c1\u6709\u534f\u8bae\uff0c\u4f7f\u7528protobuf\u7f16\u7801\uff0crest\u7528\u7684\u662fjson\u3002highway\u548crest\u90fd\u662f\u57fa\u4e8evertx\u505a\u7684\uff0cvertx\u662f\u57fa\u4e8enetty\u7684\u3002</li> </ul> </li> <li> <p>Q: ServiceComb\u548c\u670d\u52a1\u4e2d\u5fc3\u662f\u600e\u4e48\u4ea4\u4e92\u7684?</p> <ul> <li>A: \u8d70rest\uff0c\u4e3b\u8981\u8d1f\u8d23\u6ce8\u518c\uff0c\u53d6\u6570\u636e\u548c\u5fc3\u8df3\u7b49\uff1bwatch\u4e8b\u4ef6\u8d70websocket\uff0cwatch\u4e8b\u4ef6\u662f\u89c2\u5bdf\u670d\u52a1\u4e2d\u5fc3\u5b9e\u4f8b\u4fe1\u606f\u6709\u6ca1\u6709\u53d8\u66f4\u3002</li> </ul> </li> <li> <p>Q: \u6709\u7c7b\u4f3cdubbo\u90a3\u79cd\u6cbb\u7406\u4e2d\u5fc3\u5417\uff1f</p> <ul> <li>A: bizkeeper\u662f\u4e00\u4e2ahandler\uff0c\u662f\u6cbb\u7406\u7684\u5176\u4e2d\u4e00\u4e2a\u5185\u5bb9\u3002\u6cbb\u7406\u53ef\u4ee5\u901a\u8fc7handler\u6269\u5c55\u3002</li> </ul> </li> <li> <p>Q: service path\u600e\u4e48\u7406\u89e3\uff1f</p> <ul> <li>A: \u6bcf\u4e2a\u5fae\u670d\u52a1\u6709\u4e00\u4e2aservicePathManager\uff0c\u6bcf\u4e00\u4e2aschema\u5c06\u81ea\u5df1\u7684path\u6ce8\u518c\u8fdb\u53bb\u3002</li> </ul> </li> <li> <p>Q: \u6d4f\u89c8\u5668\u80fd\u76f4\u63a5\u8bbf\u95ee\u5fae\u670d\u52a1Endpoint\u5417\uff1f</p> <ul> <li>A: \u53ef\u4ee5\uff0crestful\u53d1\u5e03\u7684\u5fae\u670d\u52a1Endpoint\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u6d4f\u89c8\u5668\u4e2d\u4f7f\u7528HTTP\u52a0service path\u8bbf\u95ee\u63d0\u4f9bget\u65b9\u6cd5\u7684\u670d\u52a1\uff0c\u5982\u679c\u662f\u8bbf\u95ee\u5176\u4ed6Http\u65b9\u6cd5\u63d0\u4f9b\u7684\u670d\u52a1\u5efa\u8bae\u5b89\u88c5\u4f7f\u7528Postman\u3002</li> </ul> </li> <li> <p>Q: \u5951\u7ea6\u751f\u6210\u65f6\uff0c\u9700\u8981\u5f3a\u5236\u5e26\u4e0a\u7248\u672c\u53f7\u548c\u8bed\u8a00\u5417\uff1f</p> <ul> <li>A: \u5951\u7ea6\u662f\u5c5e\u4e8e\u5fae\u670d\u52a1\u7684\uff0c\u5fae\u670d\u52a1\u672c\u6765\u5c31\u6709\u7248\u672c\uff0c\u4f46\u8bed\u8a00\u662f\u4e0d\u5e94\u8be5\u5e26\u4e0a\u7248\u672c\u53f7\u7684\u3002\u5e94\u8be5\u5951\u7ea6\u8981\u6c42\u4e0e\u8bed\u8a00\u65e0\u5173\u3002\u5951\u7ea6\u201c\u6ca1\u6709\u7248\u672c\u201d\uff0c\u5951\u7ea6\u7684\u7248\u672c\u4f53\u73b0\u5728\u5fae\u670d\u52a1\u4e0a\uff0c\u5b9e\u4f8b\u80fd\u627e\u5230\u6240\u5c5e\u7684\u5fae\u670d\u52a1\u7684\u7248\u672c\uff0c\u5c31\u80fd\u627e\u5230\u4e00\u4e2a\u786e\u5b9a\u7684\u5951\u7ea6\u3002</li> </ul> </li> <li> <p>Q: \u5982\u679c\u540c\u65f6\u5f15\u5165\u4e86<code>transport-rest-servlet</code>\u548c<code>transport-rest-vertx</code>\u7684\u4f9d\u8d56\uff0c\u90a3\u4e48\u5b83\u600e\u4e48\u51b3\u5b9a\u91c7\u7528\u54ea\u4e00\u4e2a\uff1f</p> <ul> <li>A: \u5982\u679c\u7aef\u53e3\u6ca1\u88ab\u5360\u7528\uff0c\u5c31\u7528vertx\uff1b\u5982\u679c\u88ab\u5360\u7528\u4e86\uff0c\u5c31\u7528servlet\u3002</li> </ul> </li> <li> <p>Q: qps\u6d41\u63a7\u8bbe\u8ba1\u65f6\u662f\u51fa\u4e8e\u4ec0\u4e48\u573a\u666f\u8003\u8651\u7684\uff1f</p> <ul> <li>A: \u9650\u6d41\u6709\u4e24\u4e2a\u4e3b\u8981\u4f5c\u7528\uff0c\u7b2c\u4e00\u901a\u8fc7\u7ed9\u4e0d\u540c\u7684\u6d88\u8d39\u8005\u9650\u6d41\u4fdd\u8bc1\u5bf9\u4e00\u4e9b\u91cd\u70b9\u670d\u52a1\u7684\u670d\u52a1\u6548\u679c\uff0c\u7b2c\u4e8c\u9632\u6b62\u96ea\u5d29\u6548\u5e94\u3002\u53ef\u6839\u636e\u670d\u52a1\u7684\u91cd\u8981\u6027\u6765\u51b3\u5b9a\u6c34\u7ba1\u7684\u7c97\u7ec6\uff0cServiceComb\u662f\u652f\u6301\u6d88\u8d39\u7aef\u9650\u6d41\u548c\u670d\u52a1\u7aef\u9650\u6d41\u4e24\u79cd\u9650\u6d41\u65b9\u5f0f\u7684\uff0c\u6d88\u8d39\u7aef\u9650\u6d41\u53ef\u4ee5\u505a\u5230\u6bd4\u8f83\u7cbe\u7ec6\u7684\u63a7\u5236\u3002</li> </ul> </li> <li> <p>Q: \u5982\u679c\u670d\u52a1\u7aef\u662f\u94fe\u5f0f\u8c03\u7528\uff0c\u5373\u7c7b\u4f3ca-&gt;b-&gt;c\uff0c\u90a3\u8bbe\u7f6e\u4e86qps \u6d41\u63a7\u4f1a\u4e0d\u4f1a\u9020\u6210\u6c34\u7ba1\u7c97\u7ec6\u4e0d\u5747\u7684\u4e8b\u60c5\uff1f</p> <ul> <li>A: \u4e00\u822c\u91c7\u53d6\u7684\u6a21\u5f0f\u662f\u5148\u6d4b\u91cf\u518d\u8bbe\u7f6e\u3002qps\u8bbe\u7f6e\u6700\u7ec8\u662f\u7ed3\u5408\u6574\u4f53\u4e1a\u52a1\u9700\u6c42\u6765\u8fdb\u884c\u8c03\u63a7\u7684\uff0c\u800c\u4e0d\u662f\u5c31\u5355\u4e2a\u8282\u70b9\u6765\u8fdb\u884c\u8bbe\u7f6e\u3002</li> </ul> </li> <li> <p>Q: \u5982\u4f55\u5728\u5951\u7ea6DTO\u4e2d\u5ffd\u7565\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\uff1f</p> <ul> <li>A: \u53ef\u4ee5\u4f7f\u7528@JsonIgnore\u6ce8\u89e3\u6807\u8bb0\u9700\u8981\u5ffd\u7565\u7684\u5c5e\u6027\uff0c \u4f8b\u5982:<pre><code>public class OutputForTest{\n @JsonIgnore\n private String outputId = null;\n private String inputId = null;\n ...\n }\n</code></pre> </li> </ul> </li> </ul>"},{"location":"question-and-answer/interface-compatibility.html","title":"\u5fae\u670d\u52a1\u63a5\u53e3\u517c\u5bb9\u5e38\u89c1\u95ee\u9898","text":"<p>\u5728\u8fdb\u884c\u5fae\u670d\u52a1\u6301\u7eed\u8fed\u4ee3\u5f00\u53d1\u7684\u8fc7\u7a0b\u4e2d\uff0c\u7531\u4e8e\u65b0\u7279\u6027\u4e0d\u505c\u7684\u52a0\u5165\uff0c\u4e00\u4e9b\u8fc7\u65f6\u7684\u7279\u6027\u4e0d\u505c\u7684\u4fee\u6539\uff0c\u63a5\u53e3\u517c\u5bb9\u95ee\u9898\u9762\u4e34\u5de8\u5927\u7684\u6311\u6218\uff0c\u7279\u522b\u662f\u5728\u5141\u8bb8\u591a\u7248\u672c\u5171\u5b58\uff08\u7070\u5ea6\u53d1\u5e03\uff09\u7684\u73af\u5883\u3002\u672c\u7ae0\u8282\u4e3b\u8981\u63cf\u8ff0\u63a5\u53e3\u517c\u5bb9\u7ba1\u7406\u7684\u4e00\u4e9b\u5b9e\u8df5\u5efa\u8bae\uff0c\u4ee5\u53ca\u5728\u4f7f\u7528ServiceComb\u8fc7\u7a0b\u4e2d\u78b0\u5230\u4e86\u517c\u5bb9\u6027\u95ee\u9898\u7684\u89e3\u51b3\u529e\u6cd5\u3002\u7531\u4e8e\u5fae\u670d\u52a1\u4e00\u822c\u90fd\u901a\u8fc7REST\u63a5\u53e3\u5bf9\u5916\u63d0\u4f9b\u670d\u52a1\uff0c\u6ca1\u6709\u7279\u6b8a\u8bf4\u660e\u7684\u60c5\u51b5\u4e0b\uff0c\u8fd9\u91cc\u7684\u63a5\u53e3\u90fd\u6307REST\u63a5\u53e3\u3002</p>"},{"location":"question-and-answer/interface-compatibility.html#_2","title":"\u4fdd\u8bc1\u63a5\u53e3\u517c\u5bb9\u7684\u5b9e\u8df5","text":"<p>\u4e3a\u4e86\u9632\u6b62\u63a5\u53e3\u517c\u5bb9\u95ee\u9898\uff0c\u5f00\u53d1\u8005\u5728\u8fdb\u884c\u63a5\u53e3\u53d8\u66f4\uff08\u65b0\u589e\u3001\u4fee\u6539\u3001\u5220\u9664\u7b49\uff09\u7684\u65f6\u5019\uff0c\u5efa\u8bae\u9075\u5faa\u4e0b\u9762\u7684\u4e00\u4e9b\u539f\u5219\u3002</p> <ul> <li> <p>\u53ea\u589e\u52a0\u63a5\u53e3\uff0c\u4e0d\u4fee\u6539\u3001\u4e0d\u5220\u9664\u63a5\u53e3\u3002</p> </li> <li> <p>\u4f5c\u4e3aProvider\uff0c\u589e\u52a0\u63a5\u53e3\u7684\u65f6\u5019\uff0c\u76f8\u5e94\u7684\u5c06\u5fae\u670d\u52a1\u7248\u672c\u53f7\u9012\u589e\uff0c\u6bd4\u5982\u5c062.1.2\u4fee\u6539\u4e3a2.1.3\u3002\u7248\u672c\u53f7\u6309\u7167\u89c4\u8303\u4f7f\u7528x.y.z\u7684\u683c\u5f0f\uff0c\u53ea\u5305\u542b\u6570\u5b57\u4fbf\u4e8e\u7ba1\u7406\uff0c\u5efa\u8bae\u6bcf\u4f4d\u6570\u5b57\u4e0d\u5927\u4e8e125\u3002</p> </li> <li> <p>\u4f5c\u4e3aConsumer\uff0c\u4f7f\u7528Provider\u7684\u65b0\u63a5\u53e3\u65f6\u5019\uff0c\u6307\u5b9aProvider\u7684\u6700\u5c0f\u7248\u672c\u53f7\u3002\u6bd4\u5982\uff1a</p> </li> </ul> <pre><code>servicecomb:\n references:\n ProviderMicroserviceName: # \u4fee\u6539\u4e3aProvide\u7684\u5fae\u670d\u52a1\u540d\u79f0\n version-rule: 2.1.3+\n</code></pre> <p>\u5176\u4e2dserviceName\u4e3aProvider\u7684\u5fae\u670d\u52a1\u540d\u79f0\u3002</p> <ul> <li>\u5728\u670d\u52a1\u4e2d\u5fc3\uff0c\u5b9a\u671f\u6e05\u7406\u4e0d\u518d\u4f7f\u7528\u7684\u8001\u7248\u672c\u7684\u5fae\u670d\u52a1\u4fe1\u606f\u3002</li> </ul> <p>\u5982\u679c\u5fae\u670d\u52a1\u7684\u7248\u672c\u53f7\u6ca1\u6709\u53d8\u5316\uff0c\u5fae\u670d\u52a1\u542f\u52a8\u7684\u65f6\u5019\uff0c\u4e0d\u4f1a\u8986\u76d6\u670d\u52a1\u4e2d\u5fc3\u7684\u8001\u7248\u672c\u6570\u636e\uff0c\u4eceConsumer\u7684\u89d2\u5ea6\uff0c\u770b\u5230\u7684\u662f\u8001\u7248\u672c\u63a5\u53e3\u3002ServiceComb\u7f3a\u7701\u60c5\u51b5\u4e0b\uff0c\u5982\u679c\u51fa\u73b0\u63a5\u53e3\u53d8\u66f4\uff0c\u5e76\u4e14\u5fae\u670d\u52a1\u7248\u672c\u53f7\u6ca1\u6709\u4fee\u6539\uff0c\u542f\u52a8\u4f1a\u5931\u8d25\uff0c\u8fd9\u6837\u5c31\u5f3a\u5236\u8981\u6c42\u5f00\u53d1\u8005\u5fc5\u987b\u4fee\u6539\u7248\u672c\u53f7\uff0c\u907f\u514d\u5c06\u95ee\u9898\u9057\u6f0f\u5230\u751f\u4ea7\u73af\u8282\u3002\u5bf9\u4e8e\u65b0\u9879\u76ee\uff0c\u63a5\u53e3\u4fee\u6539\u548c\u8c03\u6574\u53ef\u80fd\u975e\u5e38\u9891\u7e41\uff0c\u5efa\u8bae\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\uff0c\u53ef\u4ee5\u4e0d\u7528\u4fee\u6539\u7248\u672c\u53f7\uff1a</p> <pre><code>service_description:\n environment: development\n</code></pre> <p>\u8fd9\u4e2a\u914d\u7f6e\u9879\u4f7f\u5f97Provider\u5f00\u53d1\u7b80\u5355\u4e86\uff0c\u5982\u679cConsumer\u5df2\u7ecf\u542f\u52a8\uff0c\u5e76\u4e14\u5e0c\u671b\u8c03\u7528\u65b0\u7684\u63a5\u53e3\uff0c\u90a3\u4e48Consumer\u4ecd\u7136\u9700\u8981\u91cd\u542f\u3002</p>"},{"location":"question-and-answer/interface-compatibility.html#_3","title":"\u63a5\u53e3\u517c\u5bb9\u5e38\u89c1\u95ee\u9898\u53ca\u5176\u89e3\u51b3\u529e\u6cd5","text":"<ul> <li>\u5f00\u53d1\u9636\u6bb5\uff0c\u7531\u4e8e\u5b58\u5728\u9891\u7e41\u7684\u63a5\u53e3\u4fee\u6539\uff0c\u53c8\u4e0d\u60f3\u9891\u7e41\u4fee\u6539\u7248\u672c\u53f7\uff0c\u5bb9\u6613\u672c\u5730\u548c\u670d\u52a1\u4e2d\u5fc3\u5951\u7ea6\u4e0d\u4e00\u81f4\uff0c\u4e14\u5951\u7ea6\u672a\u88ab\u5141\u8bb8\u66f4\u65b0\u5230\u670d\u52a1\u4e2d\u5fc3\uff0c\u5bfc\u81f4\u8c03\u8bd5\u7684\u65f6\u5019\u63a5\u53e3\u8c03\u7528\u5931\u8d25\u7684\u60c5\u51b5\u3002</li> </ul> <p>\u63a8\u8350\u4f7f\u7528ServiceComb\u63d0\u4f9b\u4e86\u5fae\u670d\u52a1\u6309environment\u533a\u5206\u3001\u9694\u79bb\u7684\u80fd\u529b(\u5f53\u524d\u652f\u6301development\u548cproduction)\uff0c\u5141\u8bb8\u5904\u4e8edevelopment\u73af\u5883\u7684\u5fae\u670d\u52a1\u5728\u4e0d\u5347\u7ea7\u7248\u672c\u7684\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u91cd\u542f\u670d\u52a1\u5373\u53ef\u91cd\u65b0\u6ce8\u518c\u5951\u7ea6\u5230\u670d\u52a1\u4e2d\u5fc3\u3002</p> <p>\u6240\u6709\u5fae\u670d\u52a1\u5728microservice.yaml\u4e2d\u589e\u5982\u4e0b\u914d\u7f6e\uff0c\u4e14\u9700\u8981\u5728Provider\u542f\u52a8\u540e\uff0c\u518d\u91cd\u542fConsumer(\u82e5\u8bf7\u6c42\u8d70edge\uff0c\u9700\u8981\u91cd\u542fedge\u670d\u52a1)\uff1a</p> <pre><code>service_description:\n name: xxx-service\n version: 0.0.1\n environment: development\n</code></pre> <ul> <li>\u5f00\u53d1\u9636\u6bb5\uff0c\u7531\u4e8e\u5b58\u5728\u9891\u7e41\u7684\u63a5\u53e3\u4fee\u6539\uff0c\u4e5f\u4e0d\u4f1a\u6e05\u7406\u670d\u52a1\u4e2d\u5fc3\u7684\u6570\u636e\uff0c\u5bb9\u6613\u51fa\u73b0\u8c03\u8bd5\u7684\u65f6\u5019\u63a5\u53e3\u8c03\u7528\u5931\u8d25\u7684\u60c5\u51b5\u3002</li> </ul> <p>\u63a8\u8350\u4f7f\u7528\u534e\u4e3a\u516c\u6709\u4e91\u5728\u7ebf\u7684\u670d\u52a1\u4e2d\u5fc3\uff0c\u53ef\u4ee5\u76f4\u63a5\u767b\u5f55\u4f7f\u7528\u5fae\u670d\u52a1\u5f15\u64ce\u63d0\u4f9b\u7684\u5fae\u670d\u52a1\u7ba1\u7406\u529f\u80fd\u5220\u9664\u5fae\u670d\u52a1\u6216\u5fae\u670d\u52a1\u5b9e\u4f8b\u3002\u5fae\u670d\u52a1\u5f15\u64ce\u4e5f\u63d0\u4f9b\u4e86\u672c\u5730\u8f7b\u91cf\u5316\u670d\u52a1\u4e2d\u5fc3\uff0c\u5c06\u670d\u52a1\u505c\u6b62\u540e\u5373\u53ef\u6e05\u7406\u670d\u52a1\u4e2d\u5fc3\u6570\u636e\u3002\u670d\u52a1\u4e2d\u5fc3\u53ca\u5176frontend\u4ee3\u7801\u5df2\u5f00\u6e90\uff0c\u9879\u76ee\u5730\u5740\u3002</p> <ul> <li> <p>\u53d1\u5e03\u9636\u6bb5\uff0c\u9700\u8981\u5ba1\u89c6\u4e0b\u63a5\u53e3\u517c\u5bb9\u7684\u5b9e\u8df5\u7684\u6b65\u9aa4\uff0c\u786e\u4fdd\u4e0d\u5728\u7ebf\u4e0a\u5f15\u5165\u63a5\u53e3\u517c\u5bb9\u95ee\u9898\u3002\u5982\u679c\u4e0d\u5c0f\u5fc3\u6f0f\u4e86\u5176\u4e2d\u7684\u67d0\u4e2a\u6b65\u9aa4\uff0c\u5219\u53ef\u80fd\u5bfc\u81f4\u5982\u4e0b\u4e00\u4e9b\u63a5\u53e3\u517c\u5bb9\u95ee\u9898\uff1a</p> </li> <li> <p>[ ] \u5982\u679c\u4fee\u6539\u3001\u5220\u9664\u63a5\u53e3\uff1a\u5bfc\u81f4\u4e00\u4e9b\u8001\u7684Consumer\u5c06\u8bf7\u6c42\u8def\u7531\u5230\u65b0\u7684Provider\uff0c\u8c03\u7528\u5931\u8d25\u3002</p> </li> </ul> <p>\u89e3\u51b3\u529e\u6cd5\uff1a\u6307\u5b9aProvider\u7684\u7248\u672c\u53f7\u3001\u6216\u4fee\u6539Consumer\u9002\u914d\u65b0\u7684Provider\u3002</p> <ul> <li>[ ] \u5982\u679c\u5fd8\u8bb0\u4fee\u6539\u5fae\u670d\u52a1\u7248\u672c\u53f7\uff1a\u5bfc\u81f4\u4e00\u4e9b\u65b0\u7684Consumer\u5c06\u8bf7\u6c42\u8def\u7531\u5230\u8001\u7684Provider\uff0c\u8c03\u7528\u5931\u8d25\u3002</li> </ul> <p>\u89e3\u51b3\u529e\u6cd5\uff1a\u5347\u7ea7Provider\u7248\u672c\u53f7\u3001\u5220\u9664\u8001\u7684Provider\u5b9e\u4f8b\u3001\u91cd\u542fConsumer\u3002</p> <ul> <li>[ ] \u5982\u679c\u5fd8\u8bb0\u914d\u7f6eConsumer\u7684\u6700\u5c0f\u4f9d\u8d56\u7248\u672c\uff1a\u5f53\u90e8\u7f72\u987a\u5e8f\u4e3a\u5148\u505c\u6b62Consumer\uff0c\u518d\u542f\u52a8Consumer\uff0c\u518d\u505c\u6b62Provider\uff0c\u518d\u542f\u52a8Provider\u7684\u60c5\u51b5\uff0cConsumer\u65e0\u6cd5\u83b7\u53d6\u5230\u65b0\u63a5\u53e3\u4fe1\u606f\uff0c\u5c31\u91c7\u7528\u4e86\u8001\u63a5\u53e3\uff0c\u5f53Provider\u542f\u52a8\u4ee5\u540e\uff0cConsumer\u53d1\u8d77\u5bf9\u65b0\u63a5\u53e3\u7684\u8c03\u7528\u4f1a\u5931\u8d25\uff1b\u6216\u8005\u5728Provider\u6ca1\u542f\u52a8\u524d\uff0c\u8c03\u7528\u65b0\u63a5\u53e3\u5931\u8d25\u7b49\u3002</li> </ul> <p>\u89e3\u51b3\u529e\u6cd5\uff1a\u5efa\u8bae\u5148\u542f\u52a8Provider\uff0c\u518d\u542f\u52a8Consumer\u3002</p> <p>\u901a\u7528\u89c4\u907f\u63aa\u65bd\uff1a\u51fa\u73b0\u7684\u63a5\u53e3\u517c\u5bb9\u95ee\u9898\u4e0d\u540c\uff0c\u5904\u7406\u65b9\u5f0f\u4f1a\u6709\u5dee\u5f02\u3002\u6781\u7aef\u60c5\u51b5\uff0c\u53ea\u9700\u8981\u6e05\u7406Provider\u3001Consumer\u7684\u5fae\u670d\u52a1\u4fe1\u606f\uff0c\u7136\u540e\u91cd\u542f\u5fae\u670d\u52a1\u5373\u53ef\u3002\u5f53\u670d\u52a1\u8c03\u7528\u5173\u7cfb\u590d\u6742\u7684\u60c5\u51b5\u4e0b\uff0c\u63a5\u53e3\u517c\u5bb9\u95ee\u9898\u5f71\u54cd\u8303\u56f4\u4f1a\u66f4\u52a0\u5e7f\u6cdb\uff0c\u540c\u65f6\u6e05\u7406Provider\u3001Consumer\u6570\u636e\u4f1a\u53d8\u5f97\u590d\u6742\uff0c\u56e0\u6b64\u5efa\u8bae\u9075\u5faa\u4e0a\u9762\u7684\u89c4\u8303\uff0c\u907f\u514d\u4e0d\u517c\u5bb9\u7684\u60c5\u51b5\u53d1\u751f\u3002</p>"},{"location":"question-and-answer/interface-compatibility.html#_4","title":"\u5e38\u89c1\u7684\u63a5\u53e3\u4e0d\u517c\u5bb9\u60c5\u51b5\u7684\u65e5\u5fd7","text":"<ul> <li>consumer method [com.huawei.paas.cse.demo.CodeFirstPojoIntf:testUserMap] not exist in swagger</li> </ul> <p>\u53ef\u80fd\u662fProvider\u589e\u52a0\u4e86\u63a5\u53e3\uff0c\u4f46\u662f\u6ca1\u6709\u66f4\u65b0\u7248\u672c\u53f7\u3002\u9700\u8981\u5220\u9664\u5fae\u670d\u52a1\u6570\u636e\u6216\u8005\u66f4\u65b0\u7248\u672c\u53f7\u540e\u91cd\u65b0\u542f\u52a8Provider\uff0c\u5e76\u91cd\u542fConsumer\u3002</p> <ul> <li>\u5951\u7ea6\u6216\u63a5\u53e3\u53d8\u66f4(\u542b\u589e\u5220\u67e5\u6539\u3001\u53c2\u6570\u53d8\u5316\u7b49)\uff0c\u4f46environment\u672a\u8bbe\u5b9a\u4e3adevelopment\uff0c\u5951\u7ea6\u4e0d\u5141\u8bb8\u66f4\u65b0\u3002schemaId\u4e3adownload\u3001upload\u7684\u4e24\u4e2a\u5951\u7ea6\u5df2\u5b58\u5728\uff0c\u4f46\u65b0\u589e\u7684schemaId\u4e3aTaskTemplateController\u7684\u65e0\u6cd5\u6ce8\u518c\uff0c\u76f8\u5e94\u63a5\u53e3\u81ea\u7136\u4f1a\u8c03\u7528\u5931\u8d25\u3002\u9700\u8981\u5347\u7ea7\u7248\u672c\u53f7\uff0c\u6216\u6307\u5b9aenvironment\u4e3adevelopment\u3002</li> </ul> <pre><code>2018-06-14 22:51:55,239 [ERROR] SchemaIds is different between local and service center. Please change microservice version. id=1f4c94c66fe011e8945700ff37174dd4 appId=uploadapp, name=upload-service, version=0.0.1, local schemaIds=[download, upload, TaskTemplateController], service center schemaIds=[download, upload] org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.checkSchemaIdSet(MicroserviceRegisterTask.java:116)\n2018-06-14 22:51:55,243 [INFO] schemaId download exists true org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:144)\n2018-06-14 22:51:55,246 [INFO] schemaId upload exists true org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:144)\n2018-06-14 22:51:55,249 [WARN] get response for org.apache.servicecomb.serviceregistry.api.response.GetExistenceResponse failed, 400:Bad Request, {\"errorCode\":\"400016\",\"errorMessage\":\"Schema does not exist\",\"detail\":\"schema does not exist.\"}\n org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.lambda$null$0(ServiceRegistryClientImpl.java:118)\n2018-06-14 22:51:55,250 [INFO] schemaId TaskTemplateController exists false org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:144)\n2018-06-14 22:51:55,258 [ERROR] Register schema 1f4c94c66fe011e8945700ff37174dd4/TaskTemplateController failed, statusCode: 400, statusMessage: Bad Request, description: {\"errorCode\":\"400014\",\"errorMessage\":\"Undefined schema id\",\"detail\":\"schemaId non-exist\uff0c can't be added, environment is production\"}\n. org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.registerSchema(ServiceRegistryClientImpl.java:306)\n</code></pre> <ul> <li>Provider\u65e0\u53ef\u7528\u7248\u672c\uff0c\u8bf7\u67e5Provider\u548cConsumer\u662f\u5426\u5c5e\u4e8e\u540c\u4e00environment(\u9ed8\u8ba4\u4e3aProduction)\uff0c\u4e14\u6210\u529f\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u3002</li> </ul> <pre><code>2018-06-15 11:03:56,045 [ERROR] invoke failed, invocation=PRODUCER rest customer-service.reactiveClient.hello org.apache.servicecomb.swagger.invocation.exception.DefaultExceptionToResponseConverter.convert(DefaultExceptionToResponseConverter.java:35)\njava.lang.IllegalStateException: Probably invoke a service before it is registered, appId=uploadapp, name=upload-service\n at org.apache.servicecomb.core.definition.schema.ConsumerSchemaFactory.getOrCreateMicroserviceMeta(ConsumerSchemaFactory.java:90)\n at org.apache.servicecomb.core.provider.consumer.ReferenceConfig.&lt;init&gt;(ReferenceConfig.java:36)\n at org.apache.servicecomb.core.provider.consumer.ConsumerProviderManager.getReferenceConfig(ConsumerProviderManager.java:82)\n</code></pre> <ul> <li>\u672c\u5730\u5f00\u53d1\u8c03\u8bd5\u65f6\u65e0\u6cd5\u4f7f\u7528\u90e8\u5206\u4e91\u4e0a\u4eea\u8868\u76d8\u529f\u80fd\uff0c\u4f1a\u51fa\u73b0\u4e0b\u8ff0\u5f02\u5e38\uff0c\u4e0d\u5f71\u54cd\u529f\u80fd\uff0c\u53ef\u4ee5\u5ffd\u7565\u3002\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6eservicecomb.monitor.client.enable\u4e3afalse\u7981\u7528\u4eea\u8868\u76d8\u529f\u80fd\u3002</li> </ul> <pre><code>2018-06-14 22:23:59,407 [WARN] {\"errorCode\":\"400012\",\"errorMessage\":\"Micro-service does not exist\",\"detail\":\"provider not exist, consumer 8e24bc416fde11e8945700ff37174dd4 find provider default/CseMonitoring/latest\"}\n org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.lambda$null$4(ServiceRegistryClientImpl.java:199)\n2018-06-14 22:23:59,408 [ERROR] Can not find any instances from service center due to previous errors. service=default/CseMonitoring/latest org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry.findServiceInstances(AbstractServiceRegistry.java:256)\n</code></pre> <ul> <li>\u4e0b\u9762\u4e24\u79cd\u9519\u8bef(\u524d\u8005\u76f4\u63a5\u6d88\u8d39upload-service\uff0c\u540e\u8005\u901a\u8fc7edge-service\u6d88\u8d39upload-service)\u5747\u8868\u793a\u63a5\u53e3\u672a\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u6216\u6d88\u8d39\u8005\u672a\u62ff\u5230\u6700\u65b0\u5951\u7ea6\uff0c\u8c03\u7528\u62a5locate path failed. \u8bf7\u6392\u9664\uff1a1\u3001Provider\u5bf9\u5e94\u63a5\u53e3\u5951\u7ea6\u5df2\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\uff0c\u5185\u5bb9\u4e0e\u672c\u5730\u5e94\u7528\u542f\u52a8\u65f6\u8f93\u51fa\u4e00\u81f4\uff1b2\u3001\u786e\u4fddConsumer\u548cedge-service\u5728Provider\u542f\u52a8\u540e\uff0c\u624b\u52a8\u91cd\u542f\u4ee5\u91cd\u65b0\u83b7\u53d6Provider\u5951\u7ea6\u4fe1\u606f\uff1b3\u3001Debug\u542f\u52a8Consumer\uff0c\u627e\u5230ConsumerSchemaFactory\u7c7b\u4e2d\u7684loadSwagger\uff08\u4f4d\u4e8eservicecomb\u7684java-chassis-core\u5305\u4e2d\uff09\uff0c\u67e5\u770bschemaContent\u5185\u5bb9\u662f\u5426\u62ff\u5230Consumer\u5bf9\u5e94\u5951\u7ea6\u5185\u5bb9\u3002</li> </ul> <pre><code>2018-06-15 14:52:45,312 [ERROR] locate path failed, status:Not Found, http method:GET, path:/favicon.ico/, microserviceName:upload-service org.apache.servicecomb.common.rest.locator.OperationLocator.locate(OperationLocator.java:72)\n</code></pre> <pre><code>2018-06-15 14:56:35,342 [ERROR] locate path failed, status:Not Found, http method:POST, path:/taskTemplate/uploadTaskTemplate/, microserviceName:upload-service org.apache.servicecomb.common.rest.locator.OperationLocator.locate(OperationLocator.java:72)\n2018-06-15 14:56:35,344 [ERROR] edge server failed. org.apache.servicecomb.edge.core.AbstractEdgeDispatcher.onFailure(AbstractEdgeDispatcher.java:33)\nInvocationException: code=404;msg=CommonExceptionData [message=Not Found]\n at org.apache.servicecomb.common.rest.locator.OperationLocator.locate(OperationLocator.java:77)\n at org.apache.servicecomb.common.rest.locator.ServicePathManager.consumerLocateOperation(ServicePathManager.java:107)\n at org.apache.servicecomb.edge.core.EdgeInvocation.locateOperation(EdgeInvocation.java:114)\n at org.apache.servicecomb.common.rest.AbstractRestInvocation.findRestOperation(AbstractRestInvocation.java:77)\n at org.apache.servicecomb.edge.core.EdgeInvocation.edgeInvoke(EdgeInvocation.java:66)\n at com.huawei.cse.houseapp.edge.ApiDispatcher.onRequest(ApiDispatcher.java:84)\n at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:223)\n</code></pre> <ul> <li>\u6d88\u8d39\u63a5\u53e3\u65f6Content-Type\u4e0d\u4e00\u81f4\u5c06\u62a5\u53c2\u6570\u975e\u6cd5\uff0c\u5982\u524d\u7aef\u4f7f\u7528form-data\uff0cProvider\u9700\u8981application/json</li> </ul> <pre><code>2018-06-27 14:51:13,939 [ERROR] invoke failed, invocation=PRODUCER rest loadbalance-isolation-server.hello.sayHello org.apache.servicecomb.swagger.invocation.exception.DefaultExceptionToResponseConverter.convert(DefaultExceptionToResponseConverter.java:35)\njava.lang.IllegalArgumentException: argument type mismatch\n at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n at java.lang.reflect.Method.invoke(Method.java:498)\n</code></pre>"},{"location":"question-and-answer/question_answer.html","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u5982\u4f55\u81ea\u5b9a\u4e49\u67d0\u4e2aJava\u65b9\u6cd5\u5bf9\u5e94\u7684REST\u63a5\u53e3\u91cc\u7684HTTP Status Code\uff1f","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>\u5bf9\u4e8e\u6b63\u5e38\u7684\u8fd4\u56de\u503c\uff0c\u53ef\u4ee5\u901a\u8fc7SwaggerAnnotation\u5b9e\u73b0\uff0c\u4f8b\u5982\uff1a</p> <pre><code>@ApiResponse(code = 300, response = String.class, message = \"\")\npublic int test(int x) {\n return 100;\n}\n</code></pre> <p>\u5bf9\u4e8e\u5f02\u5e38\u7684\u8fd4\u56de\u503c\uff0c\u53ef\u4ee5\u901a\u8fc7\u629b\u51fa\u81ea\u5b9a\u4e49\u7684InvocationException\u5b9e\u73b0\uff0c\u4f8b\u5982\uff1a\u3001</p> <pre><code> public String testException(int code) {\n String strCode = String.valueOf(code);\n switch (code) {\n case 200:\n return strCode;\n case 456:\n throw new InvocationException(code, strCode, strCode + \" error\");\n case 556:\n throw new InvocationException(code, strCode, Arrays.asList(strCode + \" error\"));\n case 557:\n throw new InvocationException(code, strCode, Arrays.asList(Arrays.asList(strCode + \" error\")));\n default:\n break;\n }\n\n return \"not expected\";\n }\n</code></pre>"},{"location":"question-and-answer/question_answer.html#_1","title":"\u95ee\u9898\u63cf\u8ff0\uff1a \u5982\u4f55\u5b9a\u5236\u81ea\u5df1\u5fae\u670d\u52a1\u7684\u65e5\u5fd7\u914d\u7f6e","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a** ServiceComb\u4e0d\u7ed1\u5b9a\u65e5\u5fd7\u5668\uff0c\u53ea\u662f\u4f7f\u7528\u4e86slf4j\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u7531\u9009\u62e9log4j/log4j2/logback\u7b49\u7b49\u3002ServiceComb\u63d0\u4f9b\u4e86\u4e00\u4e2alog4j\u7684\u6269\u5c55\uff0c\u5728\u6807\u51c6log4j\u7684\u57fa\u7840\u4e0a\uff0c\u652f\u6301log4j\u7684properties\u6587\u4ef6\u7684\u589e\u91cf\u914d\u7f6e\u3002</p> <ul> <li>\u9ed8\u8ba4\u4ee5\u89c4\u5219\uff1a\"classpath*:config/log4j.properties\"\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6</li> <li>\u5b9e\u9645\u4f1a\u641c\u7d22\u51faclasspath\u4e2d\u6240\u6709\u7684<code>config/log4j.properties\u548cconfig/log4j.*.properties</code>, \u4ece\u641c\u7d22\u51fa\u7684\u6587\u4ef6\u4e2d\u5207\u51fa<code>\\*</code>\u7684\u90e8\u5206\uff0c\u8fdb\u884calpha\u6392\u5e8f\uff0c\u7136\u540e\u6309\u987a\u5e8f\u52a0\u8f7d\uff0c\u6700\u540e\u5408\u6210\u7684\u6587\u4ef6\u4f5c\u4e3alog4j\u7684\u914d\u7f6e\u6587\u4ef6\u3002</li> <li>\u5982\u679c\u8981\u4f7f\u7528ServiceComb\u7684log4j\u6269\u5c55\uff0c\u5219\u9700\u8981\u8c03\u7528Log4jUtils.init\uff0c\u5426\u5219\u5b8c\u5168\u6309\u6807\u51c6\u7684\u65e5\u5fd7\u5668\u7684\u89c4\u5219\u4f7f\u7528\u3002</li> </ul>"},{"location":"question-and-answer/question_answer.html#transporttransport","title":"\u95ee\u9898\u63cf\u8ff0\uff1a \u5f53\u670d\u52a1\u914d\u7f6e\u4e86\u591a\u4e2atransport\u7684\u65f6\u5019\uff0c\u5728\u8fd0\u884c\u65f6\u662f\u600e\u4e48\u9009\u62e9\u4f7f\u7528\u54ea\u4e2atransport\u7684\uff1f","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <ul> <li> <p>ServiceComb\u7684consumer\u3001transport\u3001handler\u3001producer\u4e4b\u95f4\u662f\u89e3\u8026\u7684\uff0c\u5404\u529f\u80fd\u4e4b\u95f4\u901a\u8fc7\u5951\u7ea6\u5b9a\u4e49\u8054\u5408\u5728\u4e00\u8d77\u5de5\u4f5c\u7684\uff0c\u5373\uff1a consumer\u4f7f\u7528\u900f\u660erpc\uff0c\u8fd8\u662fspringmvc\u5f00\u53d1\u4e0e\u4f7f\u7528highway\uff0c\u8fd8\u662fRESTful\u5728\u7f51\u7edc\u4e0a\u4f20\u8f93\u6ca1\u6709\u5173\u7cfb\u4e0eproducer\u662f\u4f7f\u7528\u900f\u660erpc\uff0c\u8fd8\u662fjaxrs\uff0c\u6216\u8005\u662fspringmvc\u5f00\u53d1\uff0c\u4e5f\u6ca1\u6709\u5173\u7cfbhandler\u4e5f\u4e0d\u611f\u77e5\uff0c\u4e1a\u52a1\u5f00\u53d1\u65b9\u5f0f\u4ee5\u53ca\u4f20\u8f93\u65b9\u5f0f</p> </li> <li> <p>consumer\u8bbf\u95eeproducer\uff0c\u5728\u8fd0\u884c\u65f6\u7684transport\u9009\u62e9\u4e0a\uff0c\u603b\u89c4\u5219\u4e3a\uff1a consumer\u7684transport\u4e0eproducer\u7684endpoint\u53d6\u4ea4\u96c6\uff0c\u5982\u679c\u4ea4\u96c6\u540e\uff0c\u8fd8\u6709\u591a\u4e2atransport\u53ef\u9009\u62e9\uff0c\u5219\u8f6e\u6d41\u4f7f\u7528</p> </li> </ul> <p>\u5206\u89e3\u5f00\u6765\uff0c\u5b58\u5728\u4ee5\u4e0b\u573a\u666f\uff1a</p> <ul> <li>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1producer\u540c\u65f6\u5f00\u653e\u4e86highway\u4ee5\u53caRESTful\u7684endpoint</li> <li>consumer\u8fdb\u7a0b\u4e2d\u53ea\u90e8\u7f72\u4e86highway transport jar\uff0c\u5219\u53ea\u4f1a\u8bbf\u95eeproducer\u7684highway endpoint</li> <li>consumer\u8fdb\u7a0b\u4e2d\u53ea\u90e8\u7f72\u4e86RESTful transport jar\uff0c\u5219\u53ea\u4f1a\u8bbf\u95eeproducer\u7684RESTful endpoint</li> <li>consumer\u8fdb\u7a0b\u4e2d\uff0c\u540c\u65f6\u90e8\u7f72\u4e86highway\u548cRESTful transport jar\uff0c\u5219\u4f1a\u8f6e\u6d41\u8bbf\u95eeproducer\u7684highway\u3001RESTful endpoint</li> </ul> <p>\u5982\u679c\uff0c\u6b64\u65f6consumer\u60f3\u56fa\u5b9a\u4f7f\u7528\u67d0\u4e2atransport\u8bbf\u95eeproducer\uff0c\u53ef\u4ee5\u5728consumer\u8fdb\u7a0b\u7684microservice.yaml\u4e2d\u914d\u7f6e\uff0c\u6307\u5b9atransport\u7684\u540d\u79f0:</p> <pre><code>servicecomb:\n references:\n transport:\n &lt;service_name&gt;: highway\n</code></pre> <ul> <li> <p>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1producer\u53ea\u5f00\u653e\u4e86highway\u7684endpoint</p> </li> <li> <p>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86highway transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528higway\u8bbf\u95ee</p> </li> <li>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86RESTful transport jar\uff0c\u5219\u65e0\u6cd5\u8bbf\u95ee</li> <li> <p>consumer\u8fdb\u7a0b\u540c\u65f6\u90e8\u7f72\u4e86highway\u548cRESTful transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528highway\u8bbf\u95ee</p> </li> <li> <p>\u5f53\u4e00\u4e2a\u5fae\u670d\u52a1producer\u53ea\u5f00\u653e\u4e86RESTful\u7684endpoint</p> </li> <li> <p>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86highway transport jar\uff0c\u5219\u65e0\u6cd5\u8bbf\u95ee</p> </li> <li>consumer\u8fdb\u7a0b\u53ea\u90e8\u7f72\u4e86RESTful transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528RESTful\u8bbf\u95ee</li> <li>consumer\u8fdb\u7a0b\u540c\u65f6\u90e8\u7f72\u4e86highway\u548cRESTful transport jar\uff0c\u5219\u6b63\u5e38\u4f7f\u7528RESTful\u8bbf\u95ee</li> </ul>"},{"location":"question-and-answer/question_answer.html#swagger-body","title":"\u95ee\u9898\u63cf\u8ff0\uff1a swagger body\u53c2\u6570\u7c7b\u578b\u5b9a\u4e49\u9519\u8bef\uff0c\u5bfc\u81f4\u670d\u52a1\u4e2d\u5fc3\u6ce8\u518c\u7684\u5185\u5bb9\u6ca1\u6709\u7c7b\u578b\u4fe1\u606f","text":"<p>\u73b0\u8c61\u63cf\u8ff0:</p> <p>\u5b9a\u4e49\u5982\u4e0b\u63a5\u53e3\uff0c\u5c06\u53c2\u6570\u653e\u5230body\u4f20\u9012</p> <pre><code>/testInherate:\n post:\n operationId: \"testInherate\"\n parameters:\n - in: \"body\"\n name: \"xxxxx\"\n required: false\n type: string\n responses:\n 200:\n description: \"response of 200\"\n schema:\n $ref: \"#/definitions/ReponseImpl\"\n</code></pre> <p>\u91c7\u7528\u4e0a\u9762\u65b9\u5f0f\u5b9a\u4e49\u63a5\u53e3\u3002\u5728\u670d\u52a1\u6ce8\u518c\u4ee5\u540e\uff0c\u4ece\u670d\u52a1\u4e2d\u5fc3\u67e5\u8be2\u4e0b\u6765\u7684\u63a5\u53e3type: string \u4e22\u5931\uff0c\u53d8\u6210\u4e86\uff1a</p> <pre><code>/testInherate:\n post:\n operationId: \"testInherate\"\n parameters:\n - in: \"body\"\n name: \"xxxxx\"\n required: false\n responses:\n 200:\n description: \"response of 200\"\n schema:\n $ref: \"#/definitions/ReponseImpl\"\n</code></pre> <p>\u5982\u679c\u5ba2\u6237\u7aef\u6ca1\u6709\u653e\u7f6eswagger\uff0c\u8fd8\u4f1a\u62a5\u544a\u5982\u4e0b\u5f02\u5e38\uff1a</p> <p>Caused by: java.lang.ClassFormatError: Method \"testInherate\" in class ? has illegal signature \"</p> <p>\u89e3\u51b3\u65b9\u6cd5\uff1a</p> <p>\u5b9a\u4e49body\u53c2\u6570\u7684\u7c7b\u578b\u7684\u65f6\u5019\uff0c\u9700\u8981\u4f7f\u7528schema\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f7f\u7528type\u3002</p> <pre><code>/testInherate:\n post:\n operationId: \"testInherate\"\n parameters:\n - in: \"body\"\n name: \"request\"\n required: false\n schema:\n type: string\n responses:\n 200:\n description: \"response of 200\"\n schema:\n $ref: \"#/definitions/ReponseImpl\"\n</code></pre>"},{"location":"question-and-answer/question_answer.html#_2","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u5fae\u670d\u52a1\u6846\u67b6\u670d\u52a1\u8c03\u7528\u662f\u5426\u4f7f\u7528\u957f\u8fde\u63a5","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>http\u4f7f\u7528\u7684\u662f\u957f\u8fde\u63a5\uff08\u6709\u8d85\u65f6\u65f6\u95f4\uff09\uff0chighway\u65b9\u5f0f\u4f7f\u7528\u7684\u662f\u957f\u8fde\u63a5\uff08\u4e00\u76f4\u4fdd\u6301\uff09\u3002</p>"},{"location":"question-and-answer/question_answer.html#_3","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u670d\u52a1\u65ad\u8fde\u670d\u52a1\u4e2d\u5fc3\u6ce8\u518c\u4fe1\u606f\u662f\u5426\u81ea\u52a8\u5220\u9664","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>\u670d\u52a1\u4e2d\u5fc3\u5fc3\u8df3\u68c0\u6d4b\u5230\u670d\u52a1\u5b9e\u4f8b\u4e0d\u53ef\u7528\uff0c\u53ea\u4f1a\u79fb\u9664\u670d\u52a1\u5b9e\u4f8b\u4fe1\u606f\uff0c\u670d\u52a1\u7684\u9759\u6001\u6570\u636e\u4e0d\u4f1a\u79fb\u9664\u3002</p>"},{"location":"question-and-answer/question_answer.html#_4","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u5fae\u670d\u52a1\u6846\u67b6\u5982\u4f55\u5b9e\u73b0\u6570\u636e\u591a\u4e2a\u5fae\u670d\u52a1\u95f4\u900f\u4f20","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>\u900f\u4f20\u6570\u636e\u585e\u5165\uff1a</p> <pre><code>CseHttpEntity&lt;xxxx.class&gt; httpEntity = new CseHttpEntity&lt;&gt;(xxx);\n//\u900f\u4f20\u5185\u5bb9\nhttpEntity.addContext(\"contextKey\",\"contextValue\");\nResponseEntity&lt;String&gt; responseEntity = RestTemplateBuilder.create().exchange(\"cse://springmvc/springmvchello/sayhello\",HttpMethod.POST,httpEntity,String.class);\n</code></pre> <p>\u900f\u4f20\u6570\u636e\u83b7\u53d6\uff1a</p> <pre><code>@Override\n@RequestMapping(path=\"/sayhello\",method = RequestMethod.POST)\npublic String sayHello(@RequestBody Person person,InvocationContext context){\n //\u900f\u4f20\u6570\u636e\u83b7\u53d6\n context.getContext();\n return \"Hello person \" + person.getName();\n}\n</code></pre>"},{"location":"question-and-answer/question_answer.html#_5","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u5fae\u670d\u52a1\u6846\u67b6\u670d\u52a1\u5982\u4f55\u81ea\u5b9a\u4e49\u8fd4\u56de\u72b6\u6001\u7801","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <pre><code>@Override\n@RequestMapping(path = \"/sayhello\",method = RequestMethod.POST)\npublic String sayHello(@RequestBody Person person){\n InvocationContext context = ContextUtils.getInvocationContext();\n //\u81ea\u5b9a\u4e49\u72b6\u6001\u7801\n context.setStatus(Status.CREATED);\n return \"Hello person \"+person.getName();\n}\n</code></pre>"},{"location":"question-and-answer/question_answer.html#body-model","title":"\u95ee\u9898\u63cf\u8ff0\uff1a body Model\u90e8\u5206\u66b4\u9732","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>\u4e00\u4e2a\u63a5\u53e3\u5bf9\u5e94\u7684body\u5bf9\u8c61\u4e2d\uff0c\u53ef\u80fd\u6709\u4e00\u4e9b\u5c5e\u6027\u662f\u5185\u90e8\u7684\uff0c\u4e0d\u60f3\u5f00\u653e\u51fa\u53bb\uff0c\u751f\u6210schema\u7684\u65f6\u5019\u4e0d\u8981\u5e26\u51fa\u53bb\uff0c\u4f7f\u7528\uff1a</p> <pre><code>@ApiModelProperty(hidden = true)\n</code></pre>"},{"location":"question-and-answer/question_answer.html#consumer","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u6846\u67b6\u83b7\u53d6\u8fdc\u7aefconsumer\u7684\u5730\u5740","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>\u5982\u679c\u4f7f\u7528http rest\u65b9\u5f0f\uff08\u4f7f\u7528transport-rest-vertx\u4f9d\u8d56\uff09\u53ef\u4ee5\u7528\u4e0b\u9762\u8fd9\u79cd\u65b9\u5f0f\u83b7\u53d6\uff1a</p> <pre><code>HttpServletRequest request = (HttpServletRequest) invocation.getHandlerContext().get(RestConst.REST_REQUEST);\nString host = request.getRemoteHost();\n</code></pre> <p>\u5b9e\u9645\u573a\u666f\u662f\u62ff\u6700\u5916\u5c42\u7684\u5730\u5740\uff0c\u6240\u4ee5\u5e94\u8be5\u662fLB\u4f20\u5165\u5230edgeservice\uff0cedgeService\u518d\u653e\u5230context\u5916\u4e0b\u4f20\u9012\u3002</p>"},{"location":"question-and-answer/question_answer.html#handler","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u5bf9handler\u63cf\u8ff0","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>consumer\u9ed8\u8ba4\u7684handler\u662fsimpleLB\uff0c\u6ca1\u6709\u914d\u7f6e\u7684\u65f6\u5019handler\u94fe\u4f1a\u4f7f\u7528\u8fd9\u4e2a\uff0c\u5982\u679c\u914d\u7f6e\u4e86handler\uff0c\u91cc\u9762\u4e00\u5b9a\u8981\u5305\u542blb\u7684handler\uff0c\u5426\u5219\u8c03\u7528\u62a5\u9519\uff0c\u9700\u8981\u5728\u6587\u6863\u91cc\u9762\u8fdb\u884c\u8bf4\u660e\u3002</p>"},{"location":"question-and-answer/question_answer.html#netty","title":"\u95ee\u9898\u63cf\u8ff0\uff1anetty\u7248\u672c\u95ee\u9898","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>netty3\u548cnetty4\u662f\u5b8c\u5168\u4e0d\u540c\u7684\u4e09\u65b9\u4ef6\uff0c\u56e0\u4e3a\u5750\u6807\u8ddfpackage\u90fd\u4e0d\u76f8\u540c\uff0c\u6240\u4ee5\u53ef\u4ee5\u5171\u5b58\uff0c\u4f46\u662f\u8981\u6ce8\u610f\u5c0f\u7248\u672c\u95ee\u9898\uff0c\u5c0f\u7248\u672c\u5fc5\u987b\u4f7f\u7528\u7684\u7248\u672c\u3002</p>"},{"location":"question-and-answer/question_answer.html#_6","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u670d\u52a1\u8d85\u65f6\u8bbe\u7f6e","text":"<p>** \u89e3\u51b3\u65b9\u6cd5\uff1a**</p> <p>\u5728\u5fae\u670d\u52a1\u63cf\u8ff0\u6587\u4ef6\uff08microservice.yaml\uff09\u4e2d\u6dfb\u52a0\u5982\u4e0b\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n request:\n timeout: 30000\n</code></pre>"},{"location":"question-and-answer/question_answer.html#_7","title":"\u95ee\u9898\u63cf\u8ff0\uff1a\u670d\u52a1\u6cbb\u7406\u7684\u5904\u7406\u94fe\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f","text":"<p>\u89e3\u51b3\u65b9\u6cd5\uff1a</p> <p>\u5904\u7406\u94fe\u7684\u987a\u5e8f\u4e0d\u540c\uff0c\u90a3\u4e48\u7cfb\u7edf\u5de5\u4f5c\u884c\u4e3a\u4e5f\u4e0d\u540c\u3002 \u4e0b\u9762\u5217\u4e3e\u4e00\u4e0b\u5e38\u89c1\u95ee\u9898\u3002</p> <p>1\u3001loadbalance\u548cbizkeeper-consumer</p> <p>\u8fd9\u4e24\u4e2a\u987a\u5e8f\u53ef\u4ee5\u968f\u673a\u7ec4\u5408\u3002\u4f46\u662f\u884c\u4e3a\u662f\u4e0d\u4e00\u6837\u7684\u3002</p> <p>\u5f53loadbalance\u5728\u524d\u9762\u7684\u65f6\u5019\uff0c\u90a3\u4e48loadbalance\u63d0\u4f9b\u7684\u91cd\u8bd5\u529f\u80fd\u4f1a\u5728bizkeeper-consumer\u629b\u51fa\u5f02\u5e38\u65f6\u53d1\u751f\uff0c\u6bd4\u5982\u8d85\u65f6\u7b49\u3002\u4f46\u662f\u5982\u679c\u5df2\u7ecf\u505a\u4e86fallbackpolicy\u914d\u7f6e\uff0c\u6bd4\u5982returnnull\uff0c\u90a3\u4e48loadbalance\u5219\u4e0d\u4f1a\u91cd\u8bd5\u3002</p> <p>\u5982\u679cloadbalance\u5728\u540e\u9762\uff0c\u90a3\u4e48loadbalance\u7684\u91cd\u8bd5\u4f1a\u5ef6\u957f\u8d85\u65f6\u65f6\u95f4\uff0c\u5373\u4f7f\u91cd\u8bd5\u6210\u529f\uff0c\u5982\u679cbizkeeper-consumer\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u4e0d\u591f\uff0c\u90a3\u4e48\u6700\u7ec8\u7684\u8c03\u7528\u7ed3\u679c\u4e5f\u662f\u5931\u8d25\u3002</p> <p>2\u3001tracing-consumer\uff0csla-consumer\uff0ctracing-provider\uff0csla-provider</p> <p>\u8fd9\u4e9b\u5904\u7406\u94fe\u5efa\u8bae\u653e\u5230\u5904\u7406\u94fe\u7684\u6700\u5f00\u59cb\u4f4d\u7f6e\uff0c\u4fdd\u8bc1\u6210\u529f\u3001\u5931\u8d25\u7684\u60c5\u51b5\u90fd\u53ef\u4ee5\u8bb0\u5f55\u65e5\u5fd7\uff08\u7531\u4e8e\u8bb0\u5f55\u65e5\u5fd7\u9700\u8981IP\u7b49\u4fe1\u606f\uff0c\u5bf9\u4e8e\u6d88\u8d39\u8005\uff0c\u53ea\u80fd\u653e\u5230loadbalance\u540e\u9762\uff09\u3002</p> <p>\u5982\u679c\u4e0d\u9700\u8981\u8bb0\u5f55\u5ba2\u6237\u7aef\u8fd4\u56de\u7684\u5f02\u5e38\uff0c\u5219\u53ef\u4ee5\u653e\u5230\u672b\u5c3e\uff0c\u53ea\u5173\u6ce8\u7f51\u7edc\u5c42\u8fd4\u56de\u7684\u9519\u8bef\u3002\u4f46\u662f\u5982\u679cbizkeeper-consumer\u7b49\u8d85\u65f6\u63d0\u524d\u8fd4\u56de\u7684\u8bdd\uff0c\u5219\u53ef\u80fd\u4e0d\u4f1a\u8bb0\u5f55\u65e5\u5fd7\u3002</p> <p>3\u3001\u5efa\u8bae\u7684\u987a\u5e8f</p> <p>Consumer: loadbalance, tracing-consumer, sla-consumer, bizkeeper-consumer</p> <p>Provider: tracing-provider, sla-provider, bizkeeper-provider</p> <p>\u8fd9\u79cd\u987a\u5e8f\u80fd\u591f\u6ee1\u8db3\u5927\u591a\u6570\u573a\u666f\uff0c\u5e76\u4e14\u4e0d\u5bb9\u6613\u51fa\u73b0\u4e0d\u53ef\u7406\u89e3\u7684\u9519\u8bef\u3002</p>"},{"location":"question-and-answer/question_answer.html#_8","title":"\u95ee\u9898\u63cf\u8ff0\uff1a \u6587\u4ef6\u4e0a\u4f20\u4e2d\u914d\u7f6e\u9879\u6700\u5927\u8bf7\u6c42\u5927\u5c0f\u7684\u542b\u4e49","text":"<p>\u914d\u7f6e\u9879\uff1a servicecomb.uploads.maxSize</p> <p>\u542b\u4e49\uff1a \u8bf7\u6c42\u4f53\u4e2d\u5141\u8bb8\u7684\u6700\u5927\u5b57\u8282\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a-1\uff0c\u8868\u793a\u6ca1\u6709\u9650\u5236\u3002</p>"},{"location":"references-handlers/fail-retry.html","title":"\u5feb\u901f\u5931\u8d25\u548c\u91cd\u8bd5","text":"<p>\u968f\u673a\u5931\u8d25\u5728\u5fae\u670d\u52a1\u7cfb\u7edf\u7ecf\u5e38\u53d1\u751f\u3002\u4ea7\u751f\u968f\u673a\u5931\u8d25\u7684\u539f\u56e0\u975e\u5e38\u591a\uff0c\u4ee5JAVA\u5fae\u670d\u52a1\u5e94\u7528\u4e3a\u4f8b\uff0c\u9020\u6210\u8bf7\u6c42\u8d85\u65f6\u8fd9\u79cd\u968f\u673a\u5931\u8d25\u7684\u539f\u56e0\u5305\u62ec\uff1a\u7f51\u7edc\u6ce2\u52a8\u548c\u8f6f\u786c\u4ef6 \u5347\u7ea7\uff0c\u53ef\u80fd\u9020\u6210\u968f\u673a\u7684\u51e0\u79d2\u4e2d\u65ad\uff1bJVM\u5783\u573e\u56de\u6536\u3001\u7ebf\u7a0b\u8c03\u5ea6\u5bfc\u81f4\u7684\u65f6\u5ef6\u589e\u52a0\uff1b\u6d41\u91cf\u5e76\u4e0d\u662f\u5747\u5300\u7684\uff0c\u540c\u65f6\u5230\u6765\u76841000\u4e2a\u8bf7\u6c42\u548c1\u79d2\u5185\u5e73\u5747\u6765\u76841000\u4e2a\u8bf7\u6c42 \u5bf9\u7cfb\u7edf\u7684\u51b2\u51fb\u662f\u4e0d\u540c\u7684\uff0c\u524d\u8005\u66f4\u5bb9\u6613\u5bfc\u81f4\u8d85\u65f6\uff1b\u5e94\u7528\u7a0b\u5e8f\u3001\u7cfb\u7edf\u3001\u7f51\u7edc\u7684\u7efc\u5408\u5f71\u54cd\uff0c\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7a81\u7136\u7684\u5927\u6d41\u91cf\u53ef\u80fd\u4f1a\u5bf9\u5e26\u5bbd\u4ea7\u751f\u5f71\u54cd\uff0c\u4ece\u800c\u5f71\u54cd\u5176\u4ed6 \u5e94\u7528\u7a0b\u5e8f\u8fd0\u884c\uff1b\u5176\u4ed6\u5e94\u7528\u7a0b\u5e8f\u76f8\u5173\u7684\u573a\u666f\uff0c\u6bd4\u5982SSL\u9700\u8981\u83b7\u53d6\u64cd\u4f5c\u7cfb\u7edf\u71b5\uff0c\u5982\u679c\u71b5\u503c\u8fc7\u4f4e\uff0c\u4f1a\u6709\u51e0\u79d2\u7684\u5ef6\u8fdf\u3002\u7cfb\u7edf\u4e0d\u53ef\u907f\u514d\u7684\u9762\u4e34\u968f\u673a\u6545\u969c\uff0c\u5fc5\u987b\u5177\u5907 \u4e00\u5b9a\u7684\u968f\u673a\u6545\u969c\u4fdd\u62a4\u80fd\u529b\u3002</p> <p>\u91cd\u8bd5\u662f\u89e3\u51b3\u968f\u673a\u5931\u8d25\u7684\u4e00\u4e2a\u975e\u5e38\u6709\u6548\u7684\u63aa\u65bd\u3002\u4f46\u662f\u5b9e\u65bd\u91cd\u8bd5\u662f\u4e00\u4e2a\u975e\u5e38\u590d\u6742\u7684\u8bfe\u9898\u3002\u672c\u6587\u63d0\u4f9b\u4e00\u4e2a\u91cd\u8bd5\u7684\u6700\u4f73\u67b6\u6784\u65b9\u6848\uff0c\u5206\u6790\u5982\u4f55\u89e3\u51b3\u91cd\u8bd5\u9762\u4e34\u7684\u5904\u7406 \u5feb\u901f\u5931\u8d25\u7684\u95ee\u9898\u3002 </p> <p>\u4f7f\u7528<code>\u8bf7\u6c42\u8d85\u65f6</code>\u914d\u7f6e\u6765\u63a7\u5236\u5feb\u901f\u5931\u8d25\u662f\u975e\u5e38\u5e38\u89c1\u7684\u624b\u6bb5\uff0c\u56e0\u4e3a\u5b83\u7b80\u6d01\u65e0\u4fb5\u5165\uff0c\u9002\u7528\u4e8e\u5927\u591a\u6570\u5bf9\u4e8e\u6027\u80fd\u8981\u6c42\u4e0d\u9ad8\u7684\u573a\u666f\u3002\u4f46\u662f\u5bf9\u4e8e\u5927\u89c4\u6a21\u5e94\u7528\u7cfb\u7edf\uff0c\u4ee5\u53ca \u5bf9\u4e8e\u8bf7\u6c42\u65f6\u5ef6\u8981\u6c42\u975e\u5e38\u9ad8\u7684\u7cfb\u7edf\uff0c<code>\u8bf7\u6c42\u8d85\u65f6</code>\u5e76\u4e0d\u662f\u5feb\u901f\u5931\u8d25\u7684\u6709\u6548\u624b\u6bb5\uff0c\u6709\u5982\u4e0b\u539f\u56e0\uff1a</p> <ul> <li>\u8bf7\u6c42\u8d85\u65f6\u5728\u4f7f\u7528HTTP\u534f\u8bae\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u5173\u95ed\u8fde\u63a5\u3002\u8fde\u63a5\u91cd\u8fde\u662f\u975e\u5e38\u8017\u65f6\u7684\u64cd\u4f5c\uff0c\u5927\u91cf\u91cd\u8fde\u4f1a\u5bfc\u81f4\u7cfb\u7edf\u6027\u80fd\u7684\u4e25\u91cd\u6076\u5316\u3002</li> <li>\u5728\u591a\u7ebf\u7a0b\u7cfb\u7edf\uff0c\u8bf7\u6c42\u8d85\u65f6\u90fd\u662f\u901a\u8fc7\u72ec\u7acb\u7684\u7ebf\u7a0b\u8fdb\u884c\u68c0\u6d4b\u7684\u3002\u8fd9\u91cc\u6d89\u53ca\u4e00\u4e2a\u5b9e\u65f6\u8ba1\u7b97\u7684\u95ee\u9898\u3002JDK\u5e76\u4e0d\u80fd\u5f88\u597d\u7684\u5e94\u7528\u4e8e\u5b9e\u65f6\u8ba1\u7b97\u3002\u7b80\u5355\u7684\u8bb2\u5c31\u662f\u8d85\u65f6 \u68c0\u67e5\u5e76\u4e0d\u662f\u51c6\u786e\u7684\u3002\u5f53\u7cfb\u7edf\u7e41\u5fd9\u7684\u65f6\u5019\uff0c\u8d85\u65f6\u7684\u68c0\u6d4b\u51c6\u786e\u6027\u4f1a\u6301\u7eed\u4e0b\u964d\uff0c\u672c\u6765\u4e00\u4e9b\u6b63\u5e38\u5904\u7406\u672a\u8d85\u65f6\u7684\u8bf7\u6c42\uff0c\u53ef\u80fd\u88ab\u8bef\u8ba4\u4e3a\u8d85\u65f6\uff1b\u4e00\u4e9b\u8d85\u65f6\u7684\u8bf7\u6c42\uff0c \u53ef\u80fd\u63a8\u8fdf\u4e86\u4e00\u6bb5\u65f6\u95f4\u624d\u68c0\u6d4b\u5230\u3002 \u5e94\u7528\u7a0b\u5e8f\u5e94\u8be5\u51cf\u5c11\u5b9e\u65f6\u6027\u5047\u8bbe\uff0c\u5305\u62ec\uff1aclient\u5b9e\u65f6\u611f\u77e5\u5b9e\u4f8b\u4e0a\u4e0b\u7ebf\uff1b\u8d85\u65f6\u65f6\u95f4\u5f88\u7cbe\u786e\uff1b\u4efb\u52a1\u6309\u7167\u9884\u671f\u7684\u6267\u884c \u65f6\u95f4\u5904\u7406\uff1b\u4efb\u52a1\u7684\u5904\u7406\u65f6\u95f4\u6052\u5b9a\u7b49\u3002 \u4ece\u53ef\u9760\u6027\u7684\u89d2\u5ea6\uff0c\u7528\u6237\u914d\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u4e0d\u5e94\u8be5\u5f88\u77ed\uff0c\u4ece\u7ecf\u9a8c\u4e0a\u6765\u8bb2\uff0c\u8d85\u65f6\u65f6\u95f4\u914d\u7f6e\u5c0f\u4e8e1s\u7684\u60c5\u51b5\uff0c\u7cfb\u7edf\u53d1\u751f \u8d85\u65f6\u5931\u8d25\u7684\u6982\u7387\u4f1a\u663e\u8457\u63d0\u5347\u3002\u5982\u679c\u4e1a\u52a1\u7684\u5e73\u5747\u65f6\u5ef610ms\u6570\u91cf\u7ea7\uff0c\u5efa\u8bae\u8d85\u65f6\u65f6\u95f4\u914d\u7f6e\u4e0d\u5e94\u8be5\u4f4e\u4e8e1s\uff0c\u5e73\u5747\u65f6\u5ef6\u8d8a\u9ad8\uff0c\u8d85\u65f6\u65f6\u95f4\u5e94\u8be5\u7b49\u6bd4\u4f8b\u589e\u52a0\u3002</li> <li>\u8d85\u65f6\u4ee5\u540e\uff0c\u8bf7\u6c42\u8fd4\u56de\uff0c\u5e76\u4e0d\u4f1a\u4e2d\u65ad\u5df2\u7ecf\u8fdb\u884c\u7684\u4efb\u52a1\u3002\u5f3a\u5236\u4e2d\u65ad\u8fdb\u884c\u7684\u4efb\u52a1\uff08\u6bd4\u5982\u7ec8\u6b62\u7ebf\u7a0b\u7684\u65b9\u5f0f\uff09\uff0c\u4f1a\u7834\u574f\u7a0b\u5e8f\u5185\u90e8\u72b6\u6001\uff0c\u5bfc\u81f4\u975e\u5e38\u590d\u6742\u96be\u4e8e\u5206\u6790 \u7684\u6545\u969c\uff0c\u6b63\u5728\u6267\u884c\u7684\u4efb\u52a1\u9700\u8981\u4f18\u96c5\u53ef\u63a7\u5236\u7684\u7ed3\u675f\u3002</li> </ul>"},{"location":"references-handlers/fail-retry.html#_2","title":"\u5982\u4f55\u5e94\u7528\u91cd\u8bd5\u548c\u5feb\u901f\u5931\u8d25","text":"<ul> <li>\u91cd\u8bd5\u7684\u6700\u4f73\u53d1\u8d77\u65b9\u662f\u76f4\u63a5\u7684\u6d88\u8d39\u8005\uff0c\u6bd4\u5982\u5bf9\u4e8eWEB\u6d4f\u89c8\u5668\u3001\u624b\u673aAPP\u7b49\u524d\u7aef\u5e94\u7528\u3002</li> <li>\u5982\u679c\u524d\u7aef\u5e94\u7528\u65e0\u6cd5\u91cd\u8bd5\uff0c\u5728\u7f51\u5173\u8fdb\u884c\u91cd\u8bd5\u4e00\u822c\u662f\u6bd4\u8f83\u63a8\u8350\u7684\u505a\u6cd5\uff0c\u9664\u4e86\u91cd\u8bd5\uff0c\u7f51\u5173\u8fd8\u9700\u8981\u52a0\u5165\u6d41\u91cf\u63a7\u5236\u548c\u6d41\u91cf\u68b3\u7406\u529f\u80fd\uff0c\u8fc7\u6ee4\u8d85\u51fa\u7cfb\u7edf\u5904\u7406\u80fd\u529b\u7684\u6d41\u91cf\uff0c\u5e76\u5c06\u7a81\u53d1\u7684\u6d41\u91cf \u8f6c\u6362\u4e3a\u5e73\u6ed1\u7684\u6d41\u91cf\u3002</li> <li>\u5fae\u670d\u52a1\u7cfb\u7edf\u5185\u90e8\u7684\u8bf7\u6c42\u8fdb\u884c\u91cd\u8bd5\u53ef\u4ee5\u4f5c\u4e3a\u8865\u5145\uff0c\u5efa\u8bae\u9650\u5236\u91cd\u8bd5\u6b21\u6570\u4e3a2\uff0c\u8d85\u65f6\u7b49\u9519\u8bef\u573a\u666f\uff0c\u91cd\u8bd5\u53ef\u80fd\u5e26\u6765\u6027\u80fd\u6076\u5316\u3002</li> <li>\u5f53\u4e1a\u52a1\u7684\u5e73\u5747\u65f6\u5ef6\u57281ms~10ms\uff0c\u5efa\u8bae\u8d85\u65f6\u65f6\u95f4\u914d\u7f6e\u4e0d\u5c0f\u4e8e1s\uff1b10~100ms\uff0c\u8d85\u65f6\u65f6\u95f4\u914d\u7f6e\u4e0d\u5c0f\u4e8e5s\uff1b\u5927\u4e8e100ms\uff0c\u8d85\u65f6\u65f6\u95f4\u914d\u7f6e\u4e0d\u5c0f\u4e8e10s\u3002 \u4e0d\u5efa\u8bae\u8d85\u65f6\u65f6\u95f4\u8d85\u8fc730s\uff08\u7f3a\u7701\u503c\uff09\u3002\u5f53\u4e1a\u52a1\u67d0\u4e9b\u8bf7\u6c42\u9700\u8981\u8d85\u8fc730s\u7684\u65f6\u5019\uff0c\u5e94\u8be5\u5bf9\u8fd9\u4e9b\u4e1a\u52a1\u903b\u8f91\u8fdb\u884c\u7279\u6b8a\u5904\u7406\uff0c\u6bd4\u5982\u4fee\u6539\u4e3a\u72ec\u7acb\u7ebf\u7a0b\u6c60\u6267\u884c\uff0c \u5e76\u8bbe\u7f6e\u72ec\u7acb\u7684\u8d85\u65f6\u65f6\u95f4\uff1b\u6216\u8005\u4fee\u6539\u4e3a\u5f02\u6b65\u6267\u884c\uff0c\u8bf7\u6c42\u6765\u7684\u65f6\u5019\u7acb\u5373\u8fd4\u56de\uff0c\u901a\u8fc7\u5f02\u6b65\u7684\u65b9\u5f0f\u67e5\u8be2\u4efb\u52a1\u6267\u884c\u7ed3\u679c\u3002</li> </ul> <p>Java Chassis\u5efa\u8bae\u5728\u5e94\u7528\u4e2d\u642d\u914d\u4f7f\u7528\u63d0\u4f9b\u8005\u6d41\u63a7\u548c\u6d88\u8d39\u8005\u9694\u79bb\u4ed3\uff0c\u6765\u5b9e\u73b0\u5feb\u901f\u5931\u8d25\u548c\u91cd\u8bd5\u3002 \u4e0b\u9762\u662f\u4e00\u4e2a\u5fae\u670d\u52a1\u7684\u5178\u578b\u6cbb\u7406\u7ed3\u6784\uff1a</p> <p></p> <p>\u8be5\u6cbb\u7406\u7ed3\u6784\u5bf9\u5e94\u7684\u914d\u7f6e\u4e3a:</p> <pre><code>## \u670d\u52a1\u6cbb\u7406\u914d\u7f6e\nservicecomb:\n matchGroup:\n allOperation: \n matches:\n - apiPath:\n prefix: \"/\"\n rateLimiting:\n ## \u9650\u6d41\u5668\u6bcf10\u6beb\u79d2\u5141\u8bb8\u901a\u8fc7100\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\n allOperation: |\n rate: 10\n limitRefreshPeriod: 1\n timeoutDuration: 1000\n retry:\n ## \u91cd\u8bd5\u5668\u6700\u591a\u91cd\u8bd52\u6b21\uff0c\u5e76\u4e14\u5c3d\u53ef\u80fd\u9009\u62e9\u4e0d\u540c\u4e8e\u5931\u8d25\u7684\u5b9e\u4f8b\u8fdb\u884c\u91cd\u8bd5\u3002\n allOperation: |\n maxAttempts: 2\n retryOnSame: 0\n instanceIsolation:\n ## \u7194\u65ad\u5668\u9519\u8bef\u7387\u8fbe\u523050%\u6216\u8005\u8017\u65f6\u8bf7\u6c42\u8fbe\u5230100%\uff0c\u5c06\u5f00\u542f\u3002\n ## \u5f00\u542f\u65f6\u95f4\u4e3a5000\u6beb\u79d2\uff0c\u7136\u540e\u4f1a\u653e\u901a10\u4e2a\u8bf7\u6c42\u3002\n allOperation: |\n minimumNumberOfCalls: 10\n slidingWindowSize: 100\n slidingWindowType: COUNT_BASED\n failureRateThreshold: 50\n slowCallRateThreshold: 50\n slowCallDurationThreshold: 5000\n waitDurationInOpenState: 5000\n permittedNumberOfCallsInHalfOpenState: 10\n instanceBulkhead:\n ## \u9694\u79bb\u4ed3\u9650\u5236\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u4e3a20\u4e2a\uff0c\u65b0\u6765\u7684\u8bf7\u6c42\u7b49\u5f851000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\u3002\n allOperation: |\n maxConcurrentCalls: 20\n maxWaitDuration: 1000\n</code></pre>"},{"location":"references-handlers/fault-injection.html","title":"\u6545\u969c\u6ce8\u5165","text":"<p>\u7528\u6237\u5728consumer\u7aef\u4f7f\u7528\u6545\u969c\u6ce8\u5165\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u53d1\u5f80\u6307\u5b9a\u5fae\u670d\u52a1\u7684\u8bf7\u6c42\u7684\u65f6\u5ef6\u548c\u9519\u8bef\u53ca\u5176\u89e6\u53d1\u6982\u7387\u3002</p>"},{"location":"references-handlers/fault-injection.html#_2","title":"\u6ce8\u610f\u4e8b\u9879","text":"<p>\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u5ef6\u8fdf\u65f6\u95f4\u7edf\u4e00\u4e3a\u6beb\u79d2\u3002</p>"},{"location":"references-handlers/fault-injection.html#_3","title":"\u914d\u7f6e\u8bf4\u660e","text":"<p>\u6545\u969c\u6ce8\u5165\u914d\u7f6e\u9879\u8bf4\u660e</p> <p>[scope]\u4ee3\u8868\u6545\u969c\u6ce8\u5165\u7684\u751f\u6548\u8303\u56f4\uff0c\u53ef\u914d\u7f6e\u503c\u5305\u62ec\u5168\u5c40\u914d\u7f6e_global\uff0c\u6216\u6307\u5b9a\u5fae\u670d\u52a1\u7684\u670d\u52a1\u540d[ServiceName]\u3002</p> <p>[protocol]\u4ee3\u8868\u4f7f\u7528\u7684\u901a\u4fe1\u534f\u8bae\uff0c\u53ef\u914d\u7f6e\u503c\u5305\u62ecrest\u6216highway\u3002</p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u53d6\u503c\u8303\u56f4 \u662f\u5426\u5fc5\u9009 \u542b\u4e49 \u6ce8\u610f servicecomb.governance.Consumer.[scope].policy.fault.protocols.[protocol].delay.fixedDelay \u65e0 (0,9223372036854775807]\uff0c\u957f\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u5ef6\u8fdf\u65f6\u95f4 \u76ee\u524d\u65f6\u95f4\u5355\u4f4d\u662f\u6beb\u79d2 servicecomb.governance.Consumer.[scope].policy.fault.protocols.[protocol].delay.percent 100 (0,100]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u89e6\u53d1\u6982\u7387 servicecomb.governance.Consumer.[ServiceName].schemas.[schema].policy.fault.protocols.[protocol].delay.fixedDelay \u65e0 (0,9223372036854775807]\uff0c\u957f\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94schema\u7684\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u5ef6\u8fdf\u65f6\u95f4 \u652f\u6301schema\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[ServiceName].schemas.[schema].policy.fault.protocols.[protocol].delay.percent 100 (0,100]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94schema\u7684\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u89e6\u53d1\u6982\u7387 \u652f\u6301schema\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[ServiceName].schemas.[schema].operations.[operation].policy.fault.protocols.[protocol].delay.fixedDelay \u65e0 (0,9223372036854775807]\uff0c\u957f\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94operation\u7684\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u5ef6\u8fdf\u65f6\u95f4 \u652f\u6301operation\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[ServiceName].schemas.[schema].operations.[operation].policy.fault.protocols.[protocol].delay.percent 100 (0,100]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94operation\u7684\u5ef6\u8fdf\u6ce8\u5165\u8bf7\u6c42\u7684\u89e6\u53d1\u6982\u7387 \u652f\u6301operation\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[scope].policy.fault.protocols.[protocol].abort.httpStatus \u65e0 (100,999]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u9519\u8bef\u6ce8\u5165\u8bf7\u6c42\u7684http\u9519\u8bef\u7801 servicecomb.governance.Consumer.[scope].policy.fault.protocols.[protocol].abort.percent 100 (0,100]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u9519\u8bef\u6ce8\u5165\u8bf7\u6c42\u7684\u89e6\u53d1\u6982\u7387 servicecomb.governance.Consumer.[ServiceName].schemas.[schema].policy.fault.protocols.[protocol].abort.httpStatus \u65e0 (100,999]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94schema\u7684\u9519\u8bef\u6ce8\u5165\u8bf7\u6c42\u7684http\u9519\u8bef\u7801 \u652f\u6301schema\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[ServiceName].schemas.[schema].policy.fault.protocols.[protocol].abort.percent 100 (0,100]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94schema\u7684\u9519\u8bef\u6ce8\u5165\u8bf7\u6c42\u7684\u89e6\u53d1\u6982\u7387 \u652f\u6301schema\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[ServiceName].schemas.[schema].operations.[operation].policy.fault.protocols.[protocol].abort.httpStatus \u65e0 (100,999]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94operation\u7684\u9519\u8bef\u6ce8\u5165\u8bf7\u6c42\u7684http\u9519\u8bef\u7801 \u652f\u6301operation\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.governance.Consumer.[ServiceName].schemas.[schema].operations.[operation].policy.fault.protocols.[protocol].abort.percent 100 (0,100]\uff0c\u6574\u578b \u5426 Consumer\u7aef\u53d1\u9001\u5230\u5bf9\u5e94operation\u7684\u9519\u8bef\u6ce8\u5165\u8bf7\u6c42\u7684\u89e6\u53d1\u6982\u7387 \u652f\u6301operation\u7ea7\u522b\u7684\u914d\u7f6e"},{"location":"references-handlers/fault-injection.html#_4","title":"\u793a\u4f8b\u4ee3\u7801","text":"<pre><code>servicecomb:\n governance:\n Consumer:\n _global:\n policy:\n fault:\n protocols:\n rest:\n delay:\n fixedDelay: 5000\n percent: 10\n</code></pre> <pre><code>servicecomb:\n governance:\n Consumer:\n ServerFaultTest:\n schemas:\n schema:\n operations:\n operation:\n policy:\n fault:\n protocols:\n rest:\n abort:\n httpStatus: 421\n percent: 100\n</code></pre>"},{"location":"references-handlers/governance-best-practise.html","title":"\u6d41\u91cf\u7279\u5f81\u6cbb\u7406\u6700\u4f73\u5b9e\u8df5","text":"<p>\u5728Java Chassis\u8bbe\u8ba1\u53c2\u8003\u4e2d\u603b\u7ed3\u4e86\u5178\u578b\u7684\u5fae\u670d\u52a1\u5e94\u7528\u67b6\u6784\uff1a</p> <p></p> <p>\u53c2\u8003\u8fd9\u4e2a\u67b6\u6784\uff0c\u5fae\u670d\u52a1\u7cfb\u7edf\u6709\u4e24\u4e2a\u6bd4\u8f83\u91cd\u8981\u7684\u5fae\u670d\u52a1\u90e8\u4ef6\uff1a\u5e94\u7528\u7f51\u5173\u548c\u5fae\u670d\u52a1\u3002 \u8fd9\u4e24\u4e2a\u90e8\u4ef6\u662f\u5fae\u670d\u52a1\u6cbb\u7406\u7684\u91cd\u70b9\u5bf9\u8c61\uff0c\u5b83\u4eec\u6240\u5904\u7684\u4f4d\u7f6e\u548c\u4f5c\u7528\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u56e0\u6b64\u5e94\u7528\u670d\u52a1\u6cbb\u7406\u7684\u7b56\u7565\u4e5f\u4f1a\u6709\u6240\u4e0d\u540c\u3002 \u672c\u6587\u4ee5\u8fd9\u4e2a\u4e24\u4e2a\u90e8\u4ef6\u8bf4\u660e\u5e38\u89c1\u7684\u6cbb\u7406\u7b56\u7565\u8bbe\u8ba1\u3002 </p> <p>\u9996\u5148\uff0c\u5bf9\u5e94\u7cfb\u7edf\u7684\u6240\u6709API\u8bbf\u95ee\uff0c\u505a\u4e00\u4e2a\u5168\u5c40\u7684\u4e1a\u52a1\u5b9a\u4e49\u3002 </p> <pre><code>servicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath:\n prefix: \"/\"\n</code></pre>"},{"location":"references-handlers/governance-best-practise.html#_2","title":"\u5e94\u7528\u7f51\u5173\u6cbb\u7406\u8bbe\u8ba1","text":"<p>\u5e94\u7528\u7f51\u5173\u9700\u8981\u6839\u636e\u7cfb\u7edf\u80fd\u591f\u5904\u7406\u7684\u6700\u5927\u6d41\u91cf\uff0c\u914d\u7f6e\u9650\u6d41\u5668\uff0c\u5feb\u901f\u62d2\u7edd\u8d85\u8fc7\u7cfb\u7edf\u7684\u6d41\u91cf\uff0c\u7531\u7528\u6237\uff08\u524d\u7aef\u811a\u672c\uff09\u53d1\u8d77\u91cd\u8bd5\uff0c\u5728\u4fdd\u8bc1\u7cfb\u7edf\u53ef\u7528\u6027\u7684\u540c\u65f6\uff0c\u5c3d\u53ef\u80fd\u964d\u4f4e\u5bf9\u4e8e\u7528\u6237\u4f53\u9a8c\u7684\u5f71\u54cd\u3002\u8fd8\u9700\u8981\u63d0\u4f9b\u4e00\u5b9a\u7684\u57fa\u4e8e\u80cc\u538b\u7684\u670d\u52a1\u6cbb\u7406\u80fd\u529b\uff0c\u6bd4\u5982\u5982\u679c\u540e\u7aef\u670d\u52a1\u67d0\u4e2a\u5b9e\u4f8b\u4e0d\u53ef\u7528\uff0c\u6216\u8005\u67d0\u4e2a\u670d\u52a1\u521a\u521a\u542f\u52a8\u5b8c\u6bd5\uff0c\u9700\u8981\u521d\u59cb\u5316\uff0c\u53d1\u5f80\u8fd9\u4e9b\u670d\u52a1\u7684\u8bf7\u6c42\u4f1a\u8868\u73b0\u4e3a\u65f6\u5ef6\u589e\u52a0\uff0c\u5982\u679c\u4e0d\u6839\u636e\u65f6\u5ef6\u589e\u52a0\u7684\u53cd\u9988\u8fdb\u884c\u6d41\u91cf\u63a7\u5236\uff0c\u5c31\u4f1a\u5bfc\u81f4\u7528\u6237\u4f53\u9a8c\u6781\u901f\u4e0b\u964d\u3002</p> <p></p> <p>\u5e94\u7528\u7f51\u5173\u914d\u7f6e\u9650\u6d41\u5668\u3001\u7194\u65ad\u5668\u548c\u9694\u79bb\u4ed3\u3002</p> <ul> <li>\u670d\u52a1\u7aef\u9650\u6d41\u5668\uff1a\u8d85\u8fc7\u7cfb\u7edf\u6700\u5927\u5904\u7406\u80fd\u529b\u7684\u8bf7\u6c42\u573a\u666f\uff0c\u9650\u6d41\u503c\u7684\u4f9d\u636e\u662f\u538b\u6d4b\u7684\u771f\u5b9e\u80fd\u529b\u6570\u636e\uff0c\u53ef\u4ee5\u63a7\u5236\u5728\u6700\u5927\u5904\u7406\u80fd\u529b\u768480%\u5de6\u53f3\u3002\u5728\u7cfb\u7edf\u4e0a\u7ebf\u521d\u59cb\u9636\u6bb5\uff0c\u9ed8\u8ba4\u8bbe\u7f6e\u5168\u5c40\u9650\u6d41\u5668\u3002\u5728\u65e0\u6cd5\u4f30\u7b97\u9650\u6d41\u5927\u5c0f\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u5c06\u6d41\u91cf\u9650\u5236\u8bbe\u7f6e\u4e3a\u4e00\u4e2a\u6700\u5927\u503c\uff0c\u9650\u6d41\u5668\u4e5f\u53ef\u4ee5\u8d77\u5230\u6d41\u91cf\u68b3\u7406\u5e73\u6ed1\u6d41\u91cf\u7684\u4f5c\u7528\u3002</li> <li>\u5ba2\u6237\u7aef\u7194\u65ad\u5668\uff1a\u4e3b\u8981\u89e3\u51b3\u5b9e\u4f8b\u5f02\u5e38\u4e0b\u7ebf\uff0c\u672c\u5730\u7f13\u5b58\u611f\u77e5\u4e0d\u53ca\u65f6\u7684\u95ee\u9898\u3002\u5b9e\u4f8b\u7194\u65ad\u540e\u4f1a\u89e6\u53d1\u5b9e\u4f8b\u67e5\u8be2\u3002\u56e0\u6b64\uff0c\u5e94\u7528\u7f51\u5173\u7684\u7194\u65ad\u5668\u7684\u9694\u79bb\u65f6\u95f4\u4f1a\u8bbe\u7f6e\u7684\u6bd4\u8f83\u77ed\u3002</li> <li>\u5ba2\u6237\u7aef\u9694\u79bb\u4ed3\uff1a\u4e3b\u8981\u89e3\u51b3\u6545\u969c\u573a\u666f\uff0c\u6bd4\u5982\u6570\u636e\u5e93\u6545\u969c\u6062\u590d\u3001\u5b9e\u4f8b\u91cd\u542f\u7b49\uff0c\u7cfb\u7edf\u541e\u5410\u91cf\u4e0b\u964d\u7684\u60c5\u51b5\uff1b\u6216\u8005\u5fae\u670d\u52a1\u7b2c\u4e00\u6b21\u542f\u52a8\u3001\u5fae\u670d\u52a1\u957f\u671f\u6ca1\u6709\u8bf7\u6c42\u7a81\u7136\u8fdb\u6765\u5927\u91cf\u8bf7\u6c42\u7684\u573a\u666f\uff0c\u8fd9\u4e9b\u573a\u666f\u53ef\u4ee5\u9650\u5236\u5e76\u53d1\u8fde\u63a5\uff0c\u907f\u514d\u9020\u6210\u5fae\u670d\u52a1\u548c\u7f51\u5173CPU\u5927\u91cf\u4f7f\u7528\uff0c\u8bf7\u6c42\u8d85\u65f6\u3002</li> <li>\u5e94\u7528\u7f51\u5173\u53ef\u9009\u5ba2\u6237\u7aef\u5bb9\u9519\u914d\u7f6e\u3002\u6700\u4f73\u7684\u65b9\u6848\u662f\u7531\u5c0f\u7a0b\u5e8f\u3001WEB\u7aef\u5e94\u7528\u53d1\u8d77\u91cd\u8bd5\uff0c\u8fdb\u884c\u5ba2\u6237\u7aef\u5bb9\u9519\u3002 </li> </ul>"},{"location":"references-handlers/governance-best-practise.html#_3","title":"\u914d\u7f6e","text":"<pre><code>servicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath:\n prefix: \"/\"\n rateLimiting:\n ## \u9650\u6d41\u5668\u6bcf10\u6beb\u79d2\u5141\u8bb8\u901a\u8fc7100\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\n allOperation: |\n rate: 100\n limitRefreshPeriod: 10\n timeoutDuration: 1000\n instanceIsolation:\n ## \u7194\u65ad\u5668\u9519\u8bef\u7387\u8fbe\u523050%\u6216\u8005\u8017\u65f6\u8bf7\u6c42\u8fbe\u5230100%\uff0c\u5c06\u5f00\u542f\u3002\n ## \u5f00\u542f\u65f6\u95f4\u4e3a5000\u6beb\u79d2\uff0c\u7136\u540e\u4f1a\u653e\u901a10\u4e2a\u8bf7\u6c42\u3002\n allOperation: |\n minimumNumberOfCalls: 10\n slidingWindowSize: 20\n slidingWindowType: COUNT_BASED\n failureRateThreshold: 50\n slowCallRateThreshold: 100\n slowCallDurationThreshold: 1000\n waitDurationInOpenState: 5000\n permittedNumberOfCallsInHalfOpenState: 10\n instanceBulkhead:\n ## \u9694\u79bb\u4ed3\u9650\u5236\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u4e3a20\u4e2a\uff0c\u65b0\u6765\u7684\u8bf7\u6c42\u7b49\u5f851000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\u3002\n allOperation: |\n maxConcurrentCalls: 20\n maxWaitDuration: 1000\n</code></pre>"},{"location":"references-handlers/governance-best-practise.html#_4","title":"\u6301\u7eed\u6f14\u8fdb","text":"<p>\u573a\u666f\u4e00\uff1a\u8017\u65f6\u8bf7\u6c42\u9700\u8981\u914d\u7f6e\u72ec\u7acb\u7684\u9650\u6d41\u7b56\u7565\u3002\u9700\u8981\u7ed3\u5408\u4e1a\u52a1\u7684\u6301\u7eed\u6f14\u8fdb\uff0c\u8fdb\u884c\u914d\u7f6e\u589e\u52a0\u3002</p> <pre><code>servicecomb:\n matchGroup:\n timeConsumingOperation: |\n matches:\n - apiPath:\n prefix: \"/timeConsumingOperation\"\n rateLimiting:\n ## \u9650\u6d41\u5668\u6bcf100\u6beb\u79d2\u5141\u8bb8\u901a\u8fc71\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\n timeConsumingOperation: |\n rate: 1\n limitRefreshPeriod: 100\n timeoutDuration: 1000\n</code></pre> <p>\u573a\u666f\u4e8c\uff1a\u9700\u8981\u9632\u6b62\u673a\u5668\u4eba\u7684\u573a\u666f\uff0c\u6216\u8005\u9700\u8981\u9632\u6b62DDOS\u7684\u573a\u666f\uff0c\u9700\u8981\u5148\u8003\u8651\u5e94\u7528\u7f51\u5173\u7684\u6269\u5bb9\uff0c\u7136\u540e\u6839\u636e\u7528\u6237ID\u6216\u8005\u8bf7\u6c42\u7aefIP\u8fdb\u884c\u5206\u5e03\u5f0f\u9650\u6d41\u3002\u5e94\u7528\u7cfb\u7edf\u5728\u89c4\u5212\u7684\u65f6\u5019\uff0c\u9700\u8981\u8003\u8651\u5c06\u7528\u6237ID\u901a\u8fc7HTTP HEADER\u7684\u65b9\u5f0f\u4f20\u9012\uff1b\u6216\u8005ELB\u9700\u8981\u5c06\u5ba2\u6237\u7684IP\u901a\u8fc7x-real-ip HTTP HEADER\u4f20\u9012\u3002</p> <pre><code>servicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath:\n prefix: \"/\"\n identifierRateLimiting:\n ## \u9650\u6d41\u5668\u6bcf100\u6beb\u79d2\u5141\u8bb8\u901a\u8fc71\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\u3002\u76f8\u5f53\u4e8e\u9650\u5236\u6bcf\u4e2a\u7528\u62371\u79d2\u949f10\u4e2a\u8bf7\u6c42\u3002\n allOperation: |\n rate: 1\n limitRefreshPeriod: 100\n timeoutDuration: 1000\n identifier: user-id\n</code></pre>"},{"location":"references-handlers/governance-best-practise.html#_5","title":"\u5fae\u670d\u52a1\u6cbb\u7406\u8bbe\u8ba1","text":"<p>\u5fae\u670d\u52a1\u6cbb\u7406\u8bbe\u8ba1\u548c\u7f51\u5173\u8bbe\u8ba1\u6709\u5f88\u591a\u7c7b\u4f3c\u4e4b\u5904\uff0c\u4e5f\u6709\u5c11\u91cf\u7684\u5dee\u5f02\u3002 </p> <p></p> <p>\u5fae\u670d\u52a1\u914d\u7f6e\u670d\u52a1\u7aef\u9650\u6d41\u3001\u670d\u52a1\u7aef\u9694\u79bb\u4ed3\u3001\u5ba2\u6237\u7aef\u5bb9\u9519\u3001\u5ba2\u6237\u7aef\u7194\u65ad\u548c\u5ba2\u6237\u7aef\u9694\u79bb\u4ed3\u3002</p> <ul> <li>\u670d\u52a1\u7aef\u9650\u6d41\u5668\uff1a\u8d85\u8fc7\u7cfb\u7edf\u6700\u5927\u5904\u7406\u80fd\u529b\u7684\u8bf7\u6c42\u573a\u666f\uff0c\u9650\u6d41\u503c\u7684\u4f9d\u636e\u662f\u538b\u6d4b\u7684\u771f\u5b9e\u80fd\u529b\u6570\u636e\uff0c\u53ef\u4ee5\u63a7\u5236\u5728\u6700\u5927\u5904\u7406\u80fd\u529b\u768480%\u5de6\u53f3\u3002\u5728\u7cfb\u7edf\u4e0a\u7ebf\u521d\u59cb\u9636\u6bb5\uff0c\u9ed8\u8ba4\u8bbe\u7f6e\u5168\u5c40\u9650\u6d41\u5668\u3002\u5728\u65e0\u6cd5\u4f30\u7b97\u9650\u6d41\u5927\u5c0f\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u5c06\u6d41\u91cf\u9650\u5236\u8bbe\u7f6e\u4e3a\u4e00\u4e2a\u6700\u5927\u503c\uff0c\u9650\u6d41\u5668\u4e5f\u53ef\u4ee5\u8d77\u5230\u6d41\u91cf\u68b3\u7406\u5e73\u6ed1\u6d41\u91cf\u7684\u4f5c\u7528\u3002</li> <li>\u670d\u52a1\u7aef\u9694\u79bb\u4ed3\uff1a\u4e3b\u8981\u9488\u5bf9\u8017\u65f6\u8bf7\u6c42\u8fdb\u884c\u914d\u7f6e\uff0c\u9632\u6b62\u8017\u65f6\u8bf7\u6c42\u5360\u7528\u5176\u4ed6\u8bf7\u6c42\u7684\u5904\u7406\u8d44\u6e90\u3002</li> <li>\u5ba2\u6237\u7aef\u91cd\u8bd5\u5668\uff1a\u4e3b\u8981\u89e3\u51b3\u7f51\u7edc\u9519\u8bef\u3001\u670d\u52a1\u4e0a\u4e0b\u7ebf\u7684\u77ed\u6682\u6545\u969c\u7b49\u8fdb\u884c\u5feb\u901f\u91cd\u8bd5\uff0c\u964d\u4f4e\u9519\u8bef\u7387\u3002\u8be5\u91cd\u8bd5\u5668\u53ea\u9488\u5bf9\u53d1\u9001\u8bf7\u6c42\u5931\u8d25\u7684\u573a\u666f\uff0c\u4e0d\u6d89\u53ca\u63a5\u53e3\u5e42\u7b49\u95ee\u9898\u3002</li> <li>\u5ba2\u6237\u7aef\u7194\u65ad\u5668\uff1a\u4e3b\u8981\u89e3\u51b3\u5b9e\u4f8b\u6545\u969c\u5ba2\u6237\u7aef\u6ca1\u611f\u77e5\u7684\u573a\u666f\uff0c\u5b9e\u73b0\u5b9e\u4f8b\u7684\u5feb\u901f\u5237\u65b0\u548c\u540c\u6b65\u3002</li> <li>\u5ba2\u6237\u7aef\u9694\u79bb\u4ed3\uff1a\u4e3b\u8981\u89e3\u51b3\u6545\u969c\u573a\u666f\uff0c\u6bd4\u5982\u6570\u636e\u5e93\u6545\u969c\u6062\u590d\u3001\u5b9e\u4f8b\u91cd\u542f\u7b49\uff0c\u7cfb\u7edf\u541e\u5410\u91cf\u4e0b\u964d\u7684\u60c5\u51b5\uff1b\u6216\u8005\u5fae\u670d\u52a1\u7b2c\u4e00\u6b21\u542f\u52a8\u3001\u5fae\u670d\u52a1\u957f\u671f\u6ca1\u6709\u8bf7\u6c42\u7a81\u7136\u8fdb\u6765\u5927\u91cf\u8bf7\u6c42\u7684\u573a\u666f\uff0c\u8fd9\u4e9b\u573a\u666f\u53ef\u4ee5\u9650\u5236\u5e76\u53d1\u8fde\u63a5\uff0c\u907f\u514d\u9020\u6210\u5fae\u670d\u52a1\u548c\u7f51\u5173CPU\u5927\u91cf\u4f7f\u7528\uff0c\u8bf7\u6c42\u8d85\u65f6\u3002</li> </ul>"},{"location":"references-handlers/governance-best-practise.html#_6","title":"\u914d\u7f6e","text":"<pre><code>servicecomb:\n matchGroup:\n allOperation: |\n matches:\n - apiPath:\n prefix: \"/\"\n rateLimiting:\n ## \u9650\u6d41\u5668\u6bcf10\u6beb\u79d2\u5141\u8bb8\u901a\u8fc7100\u4e2a\u8bf7\u6c42\uff0c\u5982\u679c\u4e00\u4e2a\u8bf7\u6c42\u8d85\u8fc71000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\n allOperation: |\n rate: 100\n limitRefreshPeriod: 10\n timeoutDuration: 1000\n instanceIsolation:\n ## \u7194\u65ad\u5668\u9519\u8bef\u7387\u8fbe\u523050%\u6216\u8005\u8017\u65f6\u8bf7\u6c42\u8fbe\u5230100%\uff0c\u5c06\u5f00\u542f\u3002\n ## \u5f00\u542f\u65f6\u95f4\u4e3a5000\u6beb\u79d2\uff0c\u7136\u540e\u4f1a\u653e\u901a10\u4e2a\u8bf7\u6c42\u3002\n allOperation: |\n minimumNumberOfCalls: 10\n slidingWindowSize: 20\n slidingWindowType: COUNT_BASED\n failureRateThreshold: 50\n slowCallRateThreshold: 100\n slowCallDurationThreshold: 1000\n waitDurationInOpenState: 5000\n permittedNumberOfCallsInHalfOpenState: 10\n instanceBulkhead:\n ## \u9694\u79bb\u4ed3\u9650\u5236\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u4e3a20\u4e2a\uff0c\u65b0\u6765\u7684\u8bf7\u6c42\u7b49\u5f851000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\u3002\n allOperation: |\n maxConcurrentCalls: 20\n maxWaitDuration: 1000\n</code></pre>"},{"location":"references-handlers/governance-best-practise.html#_7","title":"\u6301\u7eed\u6f14\u8fdb","text":"<p>\u573a\u666f\u4e00\uff1a\u670d\u52a1\u7aef\u8017\u65f6\u8bf7\u6c42\uff0c\u9700\u8981\u589e\u52a0\u9694\u79bb\u4ed3\u914d\u7f6e\u3002</p> <pre><code>servicecomb:\n matchGroup:\n timeConsumingOperation: |\n matches:\n - apiPath:\n prefix: \"/timeConsumingOperation\"\n bulkhead:\n ## \u9694\u79bb\u4ed3\u9650\u5236\u6b63\u5728\u5904\u7406\u7684\u8bf7\u6c42\u6570\u4e3a2\u4e2a\uff0c\u65b0\u6765\u7684\u8bf7\u6c42\u7b49\u5f851000\u6beb\u79d2\u6ca1\u6709\u83b7\u53d6\u5230\n ## \u8bb8\u53ef\uff0c\u5c06\u88ab\u62d2\u7edd\u3002\n timeConsumingOperation: |\n maxConcurrentCalls: 2\n maxWaitDuration: 1000\n</code></pre>"},{"location":"references-handlers/governance-best-practise.html#_8","title":"\u5173\u4e8e\u6700\u4f73\u5b9e\u8df5\u7684\u8bf4\u660e","text":"<p>\u4efb\u4f55\u7684\u670d\u52a1\u6cbb\u7406\u7b56\u7565\uff0c\u90fd\u65e0\u6cd5\u4fdd\u8bc1\u6240\u6709\u573a\u666f\u90fd\u80fd\u591f\u4f18\u96c5\u7684\u5de5\u4f5c\uff0c\u9700\u8981\u5728\u6210\u529f\u7387\u3001\u53ef\u9760\u6027\u3001\u7528\u6237\u4f53\u9a8c\u7b49\u591a\u65b9\u9762\u8fdb\u884c\u6743\u8861\uff0c\u6700\u4f73\u5b9e\u8df5\u63d0\u5230\u7684\u7b56\u7565\u4e5f\u4e0d\u4f8b\u5916\u3002\u6700\u4f73\u5b9e\u8df5\u603b\u4f53\u4e0a\u503e\u5411\u4e8e\u8bbe\u8ba1\u4e00\u4e2a\u51c6\u5b9e\u65f6\u3001\u4f18\u5148\u4fdd\u8bc1\u7528\u6237\u4f53\u9a8c\u7684\u7b56\u7565\uff0c\u5e76\u4e14\u5c3d\u53ef\u80fd\u7684\u9632\u6b62\u7cfb\u7edf\u4ea7\u751f\u96ea\u5d29\u6548\u5e94\u3002\u8fd9\u4e2a\u7b56\u7565\u5728\u68c0\u6d4b\u5230\u7cfb\u7edf\u8fc7\u8f7d\u7684\u6761\u4ef6\u4e0b\uff0c\u4f18\u5148\u4f7f\u7528\u5feb\u901f\u5931\u8d25\u7684\u7b56\u7565\uff0c\u964d\u4f4e\u5bf9\u4e8e\u7cfb\u7edf\u8d44\u6e90\u7684\u5360\u7528\uff0c\u5e76\u901a\u8fc7\u91cd\u8bd5\u6765\u964d\u4f4e\u5feb\u901f\u5931\u8d25\u5bf9\u4e8e\u7528\u6237\u4f53\u9a8c\u7684\u5f71\u54cd\u3002\u8fd9\u79cd\u7b56\u7565\u5bf9\u4e8e\u8ffd\u6c42\u7528\u6237\u4f53\u9a8c\u7684\u4e92\u8054\u7f51\u7cfb\u7edf\u662f\u975e\u5e38\u68d2\u7684\u9009\u62e9\u3002\u8fd9\u79cd\u7b56\u7565\u4f1a\u5bfc\u81f4\u8f83\u591a\u7684\u8bf7\u6c42\u5931\u8d25\uff08\u867d\u7136\u901a\u8fc7\u91cd\u8bd5\u53ef\u4ee5\u6210\u529f\uff09\uff0c\u6240\u4ee5\u5b83\u4e0d\u592a\u9002\u5408\u5bf9\u4e8e\u6210\u529f\u7387\u8981\u6c42\u9ad8\u4e8e\u7528\u6237\u4f53\u9a8c\u5f71\u54cd\u7684\u573a\u666f\uff0c\u5bf9\u4e8e\u8fd9\u4e9b\u573a\u666f\uff0c\u5728\u9694\u79bb\u4ed3\u4e0a\u9762\u5e94\u8be5\u914d\u7f6e\u66f4\u5927\u7684\u5e76\u53d1\u6570\u9650\u5236\uff0c\u5e76\u8bbe\u7f6e\u8f83\u957f\u7684\u8bf7\u6c42\u7b49\u5f85\u65f6\u95f4\u3002</p>"},{"location":"references-handlers/intruduction.html","title":"\u5904\u7406\u94fe\u4ecb\u7ecd","text":"<p>\u5904\u7406\u94fe\u5b9a\u4e49\u4e86\u4e00\u4e2a\u8bf7\u6c42\u7684\u5904\u7406\u6d41\u7a0b\uff0c\u5305\u62ec\u7f16\u89e3\u7801\u3001\u670d\u52a1\u6cbb\u7406\u3001\u7f51\u7edc\u53d1\u9001\u7b49\u3002Java Chassis\u7684\u6838\u5fc3\u5904\u7406\u6d41\u7a0b\u5206\u4e3a <code>Provider\u5904\u7406\u6d41\u7a0b</code>\u3001<code>Consumer\u5904\u7406\u6d41\u7a0b</code>\u3001<code>Edge\u5904\u7406\u6d41\u7a0b</code>\u3002</p> <ul> <li>Provider\u5904\u7406\u6d41\u7a0b</li> </ul> <p></p> <ul> <li>Consumer\u5904\u7406\u6d41\u7a0b</li> </ul> <p></p> <ul> <li>Edge\u5904\u7406\u6d41\u7a0b</li> </ul> <p></p> <p>Java Chassis\u63d0\u4f9b\u4e86 <code>ProviderFilter</code>\u3001<code>ConsumerFilter</code>\u3001<code>EdgeFilter</code> \u5206\u522b\u5bf9\u5e94\u4e0a\u8ff0\u5904\u7406\u6d41\u7a0b\u3002</p>"},{"location":"references-handlers/intruduction.html#_2","title":"\u5f00\u53d1\u65b0\u7684\u5904\u7406\u94fe","text":"<p><code>ProviderFilter</code>\u3001<code>ConsumerFilter</code>\u3001<code>EdgeFilter</code>\u7684\u5f00\u53d1\u6d41\u7a0b\u4e00\u6837\u3002\u5f00\u53d1\u8005\u53ea\u9700\u8981\u5b9e\u73b0\u4e0a\u8ff0\u63a5\u53e3\uff0c\u5e76\u5c06\u5176\u58f0\u660e\u4e3a Bean \u5373\u53ef\u3002</p> <ul> <li>\u5b9e\u73b0Filter\u63a5\u53e3</li> </ul> <pre><code>public class EmptyFilter extends AbstractFilter implements ProviderFilter, ConsumerFilter, EdgeFilter {\n @Override\n public String getName() {\n return \"empty\";\n }\n\n @Override\n public CompletableFuture&lt;Response&gt; onFilter(Invocation invocation, FilterNode nextNode) {\n return CompletableFuture.completedFuture(Response.ok(null));\n }\n\n @Override\n public int getOrder() {\n return 0;\n }\n}\n</code></pre> <ul> <li>\u58f0\u660e\u4e3a Bean</li> </ul> <pre><code>@Configuration\npublic class EmptyFilterConfiguration {\n @Bean\n public EmptyFilter emptyFilter() {\n return new EmptyFilter();\n }\n}\n</code></pre> <p>\u4e0a\u8ff0\u5f00\u53d1\u5b8c\u6210\u7684\u5904\u7406\u94fe\u4f1a\u5728 <code>Provider\u5904\u7406\u6d41\u7a0b</code>\u3001<code>Consumer\u5904\u7406\u6d41\u7a0b</code>\u3001<code>Edge\u5904\u7406\u6d41\u7a0b</code> \u6267\u884c\u3002 \u5b83\u7684 order \u662f 0\u3002 \u7531\u4e8e\u5b83\u7ee7\u627f\u4e86 <code>AbstractFilter</code>\uff0c \u8fd8\u53ef\u4ee5\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d \u5b9a\u4e49\u662f\u5426\u542f\u7528\uff0c\u6216\u8005\u5b9a\u4e49\u5176\u4f18\u5148\u7ea7\u3002</p> <pre><code>servicecomb:\n filter:\n # Filter\u540d\u79f0\n empty:\n # \u5e94\u7528\u540d + \u670d\u52a1\u540d\n ${application}.${name}.order: 10\n ${application}.${name}.enabled: false\n</code></pre>"},{"location":"references-handlers/loadbalance.html","title":"\u8d1f\u8f7d\u5747\u8861","text":"<p>Java Chassis\u63d0\u4f9b\u4e86\u5f3a\u5927\u7684\u8d1f\u8f7d\u5747\u8861\u80fd\u529b, \u5728\u5b9e\u4f8b\u6570\u975e\u5e38\u591a\u7684\u573a\u666f\uff0c\u4e5f\u80fd\u63d0\u4f9b\u5f88\u597d\u7684\u6027\u80fd\u3002\u8d1f\u8f7d\u5747\u8861\u7684\u6838\u5fc3\u6570\u636e\u7ed3\u6784\u662f <code>DiscoveryTree</code>\uff0c<code>DiscoveryTree</code> \u5305\u542b\u4e86\u4e00\u7cfb\u5217 <code>DiscoveryFilter</code>\u3002 \u4e0b\u56fe\u5c55\u793a\u4e86\u8d1f\u8f7d\u5747\u8861\u7684\u5904\u7406\u8fc7\u7a0b\uff1a</p> <p></p>"},{"location":"references-handlers/loadbalance.html#_2","title":"\u6309\u7167\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f\u8fdb\u884c\u8def\u7531\u8f6c\u53d1","text":"<p>\u670d\u52a1\u63d0\u4f9b\u8005\u548c\u6d88\u8d39\u8005\u90fd\u53ef\u4ee5\u901a\u8fc7\u5728microservice.yaml\u4e2d\u58f0\u660e\u81ea\u5df1\u7684\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f\uff1a</p> <pre><code>servicecomb:\n datacenter:\n name: mydatacenter\n region: my-Region\n availableZone: my-Zone\n</code></pre> <p>\u6d88\u8d39\u8005\u901a\u8fc7\u6bd4\u8f83\u81ea\u5df1\u7684\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f\u548c\u63d0\u4f9b\u8005\u7684\u4fe1\u606f\uff0c\u4f18\u5148\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230region\u548cavailableZone\u90fd\u76f8\u540c\u7684\u5b9e\u4f8b\uff1b\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u5219\u8f6c\u53d1\u5230region\u76f8\u540c\u7684\u5b9e\u4f8b\uff1b\u5982\u679c\u4ecd\u7136\u4e0d\u5b58\u5728\uff0c\u5219\u8f6c\u53d1\u5230\u5176\u4ed6\u5b9e\u4f8b\u3002</p> <p>\u8fd9\u91cc\u7684region\u548cavailableZone\u662f\u4e00\u822c\u6027\u7684\u6982\u5ff5\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u884c\u786e\u5b9a\u5176\u4e1a\u52a1\u542b\u4e49\u4ee5\u4fbf\u5e94\u7528\u4e8e\u8d44\u6e90\u9694\u79bb\u7684\u573a\u666f\u4e2d\u3002\u53ef\u4ee5\u53c2\u89c1\u5fae\u670d\u52a1\u5b9e\u4f8b\u4e4b\u95f4\u7684\u903b\u8f91\u9694\u79bb\u5173\u7cfb\uff0c\u4e86\u89e3\u66f4\u591a\u5176\u4ed6\u5b9e\u4f8b\u53d1\u73b0\u76f8\u5173\u7684\u9694\u79bb\u673a\u5236\u3002</p> <p>\u8be5\u89c4\u5219\u9ed8\u8ba4\u542f\u7528\uff0c\u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528\uff0c\u53ef\u4ee5\u901a\u8fc7 <code>servicecomb.loadbalance.filter.zoneaware.enabled</code> \u8fdb\u884c\u5173\u95ed\u3002\u6570\u636e\u4e2d\u5fc3\u4fe1\u606f\u9694\u79bb\u529f\u80fd\u5728 <code>ZoneAwareDiscoveryFilter</code> \u5b9e\u73b0\u3002</p>"},{"location":"references-handlers/loadbalance.html#_3","title":"\u6839\u636e\u5b9e\u4f8b\u5c5e\u6027\u8fdb\u884c\u8def\u7531\u8f6c\u53d1","text":"<p>\u5fae\u670d\u52a1\u53ef\u4ee5\u6307\u5b9a\u5b9e\u4f8b\u7684\u5c5e\u6027\u3002\u5b9e\u4f8b\u5c5e\u6027\u53ef\u4ee5\u5728microservice.yaml\u4e2d\u6307\u5b9a\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u670d\u52a1\u4e2d\u5fc3\u7684API\u8fdb\u884c\u4fee\u6539\u3002</p> <pre><code>instance_description:\n properties:\n tags:\n tag_key: tag_value\n</code></pre> <p>\u6d88\u8d39\u8005\u53ef\u4ee5\u6307\u5b9a\u6d88\u8d39\u5177\u5907\u67d0\u4e9b\u5c5e\u6027\u7684\u5b9e\u4f8b\uff0c\u4e0d\u8bbf\u95ee\u5176\u4ed6\u5b9e\u4f8b</p> <pre><code>servicecomb:\n loadbalance:\n provider: # \u8fd9\u91cc\u8868\u793a\u914d\u7f6e\u5bf9\u540d\u4e3a\"provider\"\u7684\u670d\u52a1\u751f\u6548\uff0c\u5982\u679c\u662f\u8de8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u8fd8\u9700\u8981\u52a0\u4e0aAppID\uff0c\u5982\"AppIDOfProvider:provider\"\n transactionControl:\n options:\n tags:\n tag_key: expected_tag_value\n</code></pre> <p>\u4e0a\u9762\u7684\u914d\u7f6e\u8868\u793a\u53ea\u8bbf\u95eemyservice\u6240\u6709\u5b9e\u4f8b\u4e2d<code>tag_key</code>\u5c5e\u6027\u4e3a<code>expected_tag_value</code>\u7684\u5b9e\u4f8b\u3002</p> <p>\u8be5\u89c4\u5219\u9700\u8981\u7ed9\u6bcf\u4e2a\u670d\u52a1\u5355\u72ec\u914d\u7f6e\uff0c\u672a\u914d\u7f6e\u8868\u793a\u4e0d\u542f\u7528\u8be5\u89c4\u5219\uff0c\u4e0d\u652f\u6301\u5bf9\u4e8e\u6240\u6709\u670d\u52a1\u7684\u5168\u5c40\u914d\u7f6e\u3002</p> <p>\u8be5\u89c4\u5219\u9ed8\u8ba4\u542f\u7528\uff0c\u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528\uff0c\u53ef\u4ee5\u901a\u8fc7<code>servicecomb.loadbalance.filter.instanceProperty.enabled</code>\u8fdb\u884c\u5173\u95ed\u3002\u6839\u636e\u5b9e\u4f8b\u5c5e\u6027\u8fdb\u884c\u8def\u7531\u8f6c\u53d1\u529f\u80fd\u5728<code>InstancePropertyDiscoveryFilter</code>\u5b9e\u73b0\u3002</p>"},{"location":"references-handlers/loadbalance.html#_4","title":"\u6839\u636e\u5b9e\u4f8b\u5c5e\u6027\u503c\u7684\u5c42\u7ea7\u8fdb\u884c\u8def\u7531\u8f6c\u53d1","text":"<p>\u5b9e\u4f8b\u5c5e\u6027\u4f18\u5148\u7ea7\u5339\u914d\u53ef\u4ee5\u770b\u505a\u662f\u9488\u5bf9\u5b9e\u4f8b\u5c5e\u6027\u5339\u914d\u7684\u4e00\u79cd\u903b\u8f91\u6269\u5c55\u3002</p> <p>\u5fae\u670d\u52a1\u7684\u5b9e\u4f8b\u5c5e\u6027\u53ef\u4ee5\u5b9a\u4e49\u4e3a\u5177\u5907\u4f18\u5148\u7ea7\u7684\u683c\u5f0f\uff0c\u901a\u8fc7<code>.</code>\u7b26\u53f7\u8fdb\u884c\u5206\u5272\u3002</p> <pre><code>instance_description:\n properties:\n KEY: a.b.c\n</code></pre> <p>\u6d88\u8d39\u8005\u9700\u8981\u6307\u5b9a\u7528\u4e8e\u4f18\u5148\u7ea7\u5339\u914d\u7684\u5b9e\u4f8b\u5c5e\u6027key\uff0c\u9ed8\u8ba4\u7684key\u4e3a<code>environment</code>\u3002</p> <pre><code>servicecomb:\n loadbalance:\n filter:\n priorityInstanceProperty:\n key: KEY\n</code></pre> <p>\u5047\u8bbe\u67d0\u4e2aconsumer\u7684\u5c5e\u6027\u503c\u4e3a<code>a.b.c</code>\uff0c\u90a3\u4e48\u5c06\u4f1a\u6309\u7167<code>a.b.c</code>&gt;<code>a.b</code>&gt;<code>a</code>&gt;<code>[\u7a7a]</code> \u8fd9\u6837\u7684\u4f18\u5148\u7ea7\u987a\u5e8f\u5339\u914dprovider\u7684\u5b9e\u4f8b\uff0c\u4e00\u65e6\u5339\u914d\u5230\u5373\u7ec8\u6b62\uff0c\u4e0b\u9762\u7684\u8868\u683c\u7ed9\u51fa\u4e86\u4e0d\u540c\u60c5\u51b5\u7684\u5177\u4f53\u793a\u4f8b</p> consumer match priority of provider a.b.c a.b.c&gt;a.b&gt;a&gt;[\u7a7a] a.b a.b&gt;a&gt;[\u7a7a] a a&gt;[\u7a7a] [\u7a7a] [\u7a7a] <p>\u6ce8\u610f[\u7a7a]\u662f\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5\uff0c\u5373\u672a\u8bbe\u7f6e\u8be5\u5c5e\u6027\u7684\u5b9e\u4f8b</p> <p>\u8be5\u89c4\u5219\u9ed8\u8ba4\u5173\u95ed\uff0c\u5982\u679c\u9700\u8981\u5f00\u542f\uff0c\u53ef\u4ee5\u901a\u8fc7<code>servicecomb.loadbalance.filter.priorityInstanceProperty.enabled</code>\u914d\u7f6e\u6253\u5f00\u3002\u8be5\u529f\u80fd\u5728<code>PriorityInstancePropertyDiscoveryFilter</code>\u4e2d\u5b9e\u73b0\u3002</p>"},{"location":"references-handlers/loadbalance.html#_5","title":"\u914d\u7f6e\u8def\u7531\u89c4\u5219","text":"<p>\u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u9879\u6307\u5b9a\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u3002</p> <pre><code>servicecomb:\n loadbalance:\n strategy:\n name: RoundRobin # Support RoundRobin,Random,WeightedResponse,SessionStickiness\n</code></pre> <p>\u5f00\u53d1\u8005\u53ef\u4ee5\u9488\u5bf9\u4e0d\u540c\u7684\u5fae\u670d\u52a1\u914d\u7f6e\u4e0d\u4e00\u6837\u7684\u7b56\u7565\uff0c\u53ea\u9700\u8981\u7ed9\u914d\u7f6e\u9879\u589e\u52a0\u670d\u52a1\u540d\uff0c\u4f8b\u5982\uff1a</p> <pre><code>servicecomb:\n loadbalance:\n myservice:\n strategy:\n name: RoundRobin # Support RoundRobin,Random,WeightedResponse,SessionStickiness\n</code></pre> <p>\u6bcf\u79cd\u7b56\u7565\u8fd8\u6709\u4e00\u4e9b\u4e13\u5c5e\u914d\u7f6e\u9879\uff0c\u4e5f\u652f\u6301\u9488\u5bf9\u4e0d\u540c\u5fae\u670d\u52a1\u8fdb\u884c\u914d\u7f6e\u3002</p> <ul> <li>SessionStickiness</li> </ul> <pre><code>servicecomb:\n loadbalance:\n SessionStickinessRule:\n sessionTimeoutInSeconds: 30 # \u5ba2\u6237\u7aef\u95f2\u7f6e\u65f6\u95f4\uff0c\u8d85\u8fc7\u9650\u5236\u540e\u9009\u62e9\u540e\u9762\u7684\u670d\u52a1\u5668\n successiveFailedTimes: 5 # \u5ba2\u6237\u7aef\u5931\u8d25\u6b21\u6570\uff0c\u8d85\u8fc7\u540e\u4f1a\u5207\u6362\u670d\u52a1\u5668\n</code></pre>"},{"location":"references-handlers/loadbalance.html#_6","title":"\u81ea\u5b9a\u4e49","text":"<p>\u8d1f\u8f7d\u5747\u8861\u6a21\u5757\u63d0\u4f9b\u7684\u529f\u80fd\u5df2\u7ecf\u975e\u5e38\u5f3a\u5927\uff0c\u80fd\u591f\u901a\u8fc7\u914d\u7f6e\u652f\u6301\u5927\u90e8\u5206\u5e94\u7528\u573a\u666f\u3002\u540c\u65f6\u5b83\u4e5f\u63d0\u4f9b\u4e86\u5f3a\u5927\u7684\u6269\u5c55\u80fd\u529b\uff0c\u5305\u62ecDiscoveryFilter\u3001ServerListFilterExt\u3001ExtensionsFactory\uff08\u6269\u5c55IRule\uff0cRetryHandler\u7b49\uff09\u3002loadbalance\u6a21\u5757\u672c\u8eab\u5305\u542b\u4e86\u6bcf\u4e00\u4e2a\u6269\u5c55\u7684\u5b9e\u73b0\uff0c\u8fd9\u91cc\u4e0d\u518d\u8be6\u7ec6\u63cf\u8ff0\u5982\u4f55\u6269\u5c55\uff0c\u53ea\u7b80\u5355\u63cf\u8ff0\u6b65\u9aa4\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u81ea\u884c\u4e0b\u8f7dServiceComb\u6e90\u7801\u8fdb\u884c\u53c2\u8003\u3002</p> <ul> <li>DiscoveryFilter</li> <li>\u5b9e\u73b0DiscoveryFilter\u63a5\u53e3</li> <li> <p>\u914d\u7f6eSPI\uff1a\u589e\u52a0META-INF/services/org.apache.servicecomb.serviceregistry.discovery.DiscoveryFilter\u6587\u4ef6\uff0c\u5185\u5bb9\u4e3a\u5b9e\u73b0\u7c7b\u7684\u5168\u540d</p> </li> <li> <p>ServerListFilterExt</p> </li> <li>\u5b9e\u73b0ServerListFilterExt\u63a5\u53e3</li> <li>\u914d\u7f6eSPI\uff1a\u589e\u52a0META-INF/services/org.apache.servicecomb.loadbalance.ServerListFilterExt\u6587\u4ef6\uff0c\u5185\u5bb9\u4e3a\u5b9e\u73b0\u7c7b\u7684\u5168\u540d</li> <li> <p>\u6ce8\u610f\uff1a\u8fd9\u4e2a\u5f00\u53d1\u8bf4\u660e\u9002\u7528\u4e8e1.0.0\u53ca\u5176\u4ee5\u540e\u7684\u7248\u672c\uff0c\u65e9\u671f\u7684\u7248\u672c\u5f00\u53d1\u65b9\u5f0f\u4e0d\u540c\u3002</p> </li> <li> <p>ExtensionsFactory</p> </li> <li>\u5b9e\u73b0ExtensionsFactory\uff0c\u5e76\u4f7f\u7528@Component\u5c06\u5176\u53d1\u5e03\u4e3a\u4e00\u4e2aspring bean\u3002</li> </ul>"},{"location":"references-handlers/publickey.html","title":"\u516c\u94a5\u8ba4\u8bc1","text":""},{"location":"references-handlers/publickey.html#_2","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u516c\u94a5\u8ba4\u8bc1\u662fServiceComb\u63d0\u4f9b\u7684\u4e00\u79cd\u7b80\u5355\u9ad8\u6548\u7684\u5fae\u670d\u52a1\u4e4b\u95f4\u8ba4\u8bc1\u673a\u5236\uff0c\u5b83\u7684\u5b89\u5168\u6027\u5efa\u7acb\u5728\u5fae\u670d\u52a1\u4e0e\u670d\u52a1\u4e2d\u5fc3\u4e4b\u95f4\u7684\u4ea4\u4e92\u662f\u53ef\u4fe1\u7684\u57fa\u7840\u4e4b\u4e0a\uff0c\u5373\u5fae\u670d\u52a1\u548c\u670d\u52a1\u4e2d\u5fc3\u4e4b\u95f4\u5fc5\u987b\u5148\u542f\u7528\u8ba4\u8bc1\u673a\u5236\u3002\u5b83\u7684\u57fa\u672c\u6d41\u7a0b\u5982\u4e0b\uff1a</p> <ol> <li>\u5fae\u670d\u52a1\u542f\u52a8\u7684\u65f6\u5019\uff0c\u751f\u6210\u79d8\u94a5\u5bf9\uff0c\u5e76\u5c06\u516c\u94a5\u6ce8\u518c\u5230\u670d\u52a1\u4e2d\u5fc3\u3002</li> <li>\u6d88\u8d39\u8005\u8bbf\u95ee\u63d0\u4f9b\u8005\u4e4b\u524d\uff0c\u4f7f\u7528\u81ea\u5df1\u7684\u79c1\u94a5\u5bf9\u6d88\u606f\u8fdb\u884c\u7b7e\u540d\u3002</li> <li>\u63d0\u4f9b\u8005\u4ece\u670d\u52a1\u4e2d\u5fc3\u83b7\u53d6\u6d88\u8d39\u8005\u516c\u94a5\uff0c\u5bf9\u7b7e\u540d\u7684\u6d88\u606f\u8fdb\u884c\u6821\u9a8c\u3002</li> </ol>"},{"location":"references-handlers/publickey.html#_3","title":"\u914d\u7f6e\u9ed1\u767d\u540d\u5355","text":"<p>\u57fa\u4e8e\u516c\u94a5\u8ba4\u8bc1\u673a\u5236\uff0cServiceComb\u63d0\u4f9b\u4e86\u9ed1\u767d\u540d\u5355\u529f\u80fd\u3002\u901a\u8fc7\u9ed1\u767d\u540d\u5355\uff0c\u53ef\u4ee5\u63a7\u5236\u5fae\u670d\u52a1\u5141\u8bb8\u5176\u4ed6\u54ea\u4e9b\u670d\u52a1\u8bbf\u95ee\u3002\u76ee\u524d\u652f\u6301\u901a\u8fc7\u914d\u7f6e\u670d\u52a1\u5c5e\u6027\u6765\u63a7\u5236\uff0c\u914d\u7f6e\u9879\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n publicKey:\n accessControl:\n black:\n list01:\n category: property ## property, fixed value\n propertyName: serviceName ## property name\n# property value match expression. \n# only supports prefix match and postfix match and exactly match. \n# e.g. hacker*, *hacker, hacker\n rule: hacker \n white:\n list02:\n category: property\n propertyName: serviceName\n rule: cust*\n</code></pre> <p>\u4ee5\u4e0a\u89c4\u5219\u914d\u7f6e\u4e86\u9ed1\u540d\u5355\uff0c\u4e0d\u5141\u8bb8\u5fae\u670d\u52a1\u540d\u79f0\u4e3ahacker\u7684\u8bbf\u95ee\uff1b\u767d\u540d\u5355\uff0c\u5141\u8bb8\u5fae\u670d\u52a1\u540d\u79f0\u4e3acust\u524d\u7f00\u7684\u670d\u52a1\u8bbf\u95ee\u3002</p> <p>ServiceComb\u63d0\u4f9b\u4e86trust-sample\u6765\u6f14\u793a\u9ed1\u767d\u540d\u5355\u529f\u80fd\u3002</p>"},{"location":"references-handlers/ratelimit.html","title":"\u9650\u6d41","text":"<p>java-chassis \u652f\u6301 Provider \u9650\u6d41\u548c Consumer \u9650\u6d41\u3002 Provider \u9650\u6d41\u63a7\u5236\u8bbf\u95ee\u672c\u5fae\u670d\u52a1\u7684\u6d41\u91cf\uff0c Consumer \u9650\u6d41\u63a7\u5236\u53d1\u5f80\u5176\u4ed6\u5fae\u670d\u52a1\u7684\u6d41\u91cf\u3002</p> <p>\u6ce8\u610f\u4e8b\u9879\uff1a</p> <ol> <li>\u9650\u6d41\u7b56\u7565\u7684\u63a7\u5236\u5e76\u4e0d\u662f\u7edd\u5bf9\u7cbe\u786e\u7684\uff0c\u53ef\u80fd\u4f1a\u6709\u5c11\u91cf\u8bef\u5dee\u3002</li> <li>\u6d41\u91cf\u63a7\u5236\u662f\u4e1a\u52a1\u5c42\u9762\u7684\u529f\u80fd\uff0c\u4e0d\u662f\u5b89\u5168\u610f\u4e49\u4e0a\u7684\u6d41\u91cf\u63a7\u5236\uff0c\u5982\u9700\u9632\u6b62DDoS\u653b\u51fb\uff0c\u9700\u8981\u7ed3\u5408\u5176\u4ed6\u7684\u4e00\u7cfb\u5217\u63aa\u65bd\u3002</li> <li>\u6d41\u91cf\u63a7\u5236\u662f\u5fae\u670d\u52a1\u7ea7\u7684\uff0c\u4e0d\u662f\u5b9e\u4f8b\u7ea7\u7684\u3002\u4f8b\u5982\u4e00\u4e2aconsumer\u670d\u52a1\u6709\u4e09\u4e2a\u5b9e\u4f8b\uff0c\u5f53\u5bf9\u5b83\u4eec\u4f9d\u8d56\u7684provider\u5b9e\u4f8b\u914d\u7f6e\u9650\u6d41\u7b56\u7565\u540e\uff0c provider\u4e0d\u4f1a\u533a\u5206consumer\u7684\u8bf7\u6c42\u5177\u4f53\u662f\u7531\u54ea\u4e2a\u5b9e\u4f8b\u53d1\u51fa\u7684\uff0c\u800c\u662f\u6c47\u603b\u6210\u5fae\u670d\u52a1\u7ea7\u7684\u7edf\u8ba1\u6570\u636e\u8fdb\u884c\u9650\u6d41\u5224\u65ad\u3002</li> <li>\u672c\u6a21\u5757\u4ecb\u7ecd\u7684\u9650\u6d41\u673a\u5236\u662f\u57fa\u4e8e <code>operation</code> \u7684\uff0c \u4f7f\u7528\u8d77\u6765\u6bd4\u8f83\u7b80\u5355\u3002\u540e\u7eed\u63a8\u8350\u4f7f\u7528\u6d41\u91cf\u7279\u5f81\u6cbb\u7406 \u6765\u9650\u5236\u6d41\u91cf\u3002 </li> </ol>"},{"location":"references-handlers/ratelimit.html#_2","title":"\u6d41\u63a7\u7b97\u6cd5\u8bf4\u660e","text":"<ul> <li>\u7b97\u6cd5\u8bf4\u660e\uff1a</li> <li>\u56fa\u5b9a\u7a97\u53e3\u7b97\u6cd5\uff1a\u9ed8\u8ba4\u7a97\u53e3\u5927\u5c0f\u4e3a1s\uff0c\u6700\u5927\u53ef\u80fd\u4ea7\u751f2\u500d\u4e8e\u6307\u5b9a\u6d41\u91cf\u8bbe\u7f6e\u5927\u5c0f\u7684\u8bef\u5dee\u3002</li> <li>\u4ee4\u724c\u6876\u7b97\u6cd5\uff1a\u4ee4\u724c\u6876\u7684\u4e3b\u8981\u601d\u60f3\u662f\uff0c\u8bbe\u7f6e\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u6876\uff0c\u4ee5\u6052\u5b9a\u901f\u7387\u5411\u91cc\u9762\u52a0\u5165\u4ee4\u724c\uff0c\u6bcf\u6b21\u65b0 \u8bf7\u6c42\u5230\u6765\u65f6\u4ece\u91cc\u9762\u53d6\u4e00\u4e2a\u4ee4\u724c\u51fa\u6765\uff0c\u5982\u679c\u6ca1\u6709\u4ee4\u724c\u53ef\u53d6\uff0c\u5219\u8bf7\u6c42\u76f4\u63a5\u5931\u8d25(\u88ab\u9650\u6d41)\u3002</li> <li>\u6f0f\u6876\u7b97\u6cd5\uff1a\u6f0f\u6876\u7b97\u6cd5\u7684\u4e3b\u8981\u601d\u60f3\u662f\uff0c\u8bbe\u7f6e\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u6876\uff0c\u8bf7\u6c42\u4e0d\u65ad\u52a0\u5165\u6876\u4e2d\u540c\u65f6\u4ee5\u56fa\u5b9a\u5927\u5c0f\u4ece\u6876 \u5185\u90e8\u6d41\u51fa\uff0c\u5982\u679c\u8fbe\u5230\u6876\u7684\u6781\u9650\u5927\u5c0f\uff0c\u5219\u8bf7\u6c42\u6ea2\u51fa(\u5931\u8d25)\u3002\u5728\u5185\u90e8\u5b9e\u73b0\u4e0a\u6f0f\u6876\u7b97\u6cd5\u4e0e\u4ee4\u724c\u6876\u7b97\u6cd5\u7684\u5b9e\u73b0 \u539f\u7406\u76f8\u540c\uff0c\u6839\u636e\u8bbe\u7f6e\u7684\u6876\u5927\u5c0f\u4e0d\u540c\uff0c\u80fd\u627f\u8f7d\u7684\u7a81\u53d1\u6d41\u91cf\u4e0d\u540c\u3002</li> <li>\u7528\u6237\u81ea\u5b9a\u4e49\u6d41\u63a7\u7b97\u6cd5\uff1a\u53ef\u4ee5\u53c2\u8003 \u793a\u4f8b\u5b9e\u73b0 ,\u4ee5\u53ca\u8be5\u5b9e\u73b0\u4e0b\u7684\u914d\u7f6e\u65b9\u6cd5\u3002</li> </ul>"},{"location":"references-handlers/ratelimit.html#provider","title":"Provider\u7aef\u4f7f\u7528\u9650\u6d41","text":"<p>\u7528\u6237\u5728provider\u7aef\u4f7f\u7528\u9650\u6d41\u7b56\u7565\uff0c\u53ef\u4ee5\u9650\u5236\u6307\u5b9a\u5fae\u670d\u52a1\u5411\u5176\u53d1\u9001\u8bf7\u6c42\u7684\u9891\u7387\uff0c\u8fbe\u5230\u9650\u5236\u6bcf\u79d2\u949f\u6700\u5927\u8bf7\u6c42\u6570\u91cf\u7684\u6548\u679c\u3002</p>"},{"location":"references-handlers/ratelimit.html#_3","title":"\u914d\u7f6e\u8bf4\u660e","text":"<p>\u9650\u6d41\u7b56\u7565\u914d\u7f6e\u5728microservice.yaml\u6587\u4ef6\u4e2d\uff0c\u76f8\u5173\u914d\u7f6e\u9879\u5982\u4e0b\uff1a</p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u53d6\u503c\u8303\u56f4 \u662f\u5426\u5fc5\u9009 \u542b\u4e49 \u6ce8\u610f servicecomb.flowcontrol.Provider.qps.enabled true true/false \u5426 \u662f\u5426\u542f\u7528Provider\u6d41\u63a7 - servicecomb.flowcontrol.strategy FixedWindow FixedWindow/LeakyBucket/TokenBucket/\u81ea\u5b9a\u4e49 \u5426 \u6d41\u63a7\u7b56\u7565 - servicecomb.flowcontrol.Provider.qps.limit.[ServiceName].[Schema].[operation] 2147483647\uff08max int\uff09 (0,2147483647]\uff0c\u6574\u578b \u5426 \u6bcf\u79d2\u949f\u5141\u8bb8\u7684\u8bf7\u6c42\u6570 \u652f\u6301microservice/schema/operation\u4e09\u4e2a\u7ea7\u522b\u7684\u914d\u7f6e\uff0c\u540e\u8005\u7684\u4f18\u5148\u7ea7\u9ad8\u4e8e\u524d\u8005 servicecomb.flowcontrol.Provider.qps.global.limit 2147483647\uff08max int\uff09 (0,2147483647]\uff0c\u6574\u578b \u5426 provider\u63a5\u53d7\u8bf7\u6c42\u6d41\u91cf\u7684\u5168\u5c40\u914d\u7f6e \u6ca1\u6709\u5177\u4f53\u7684\u6d41\u63a7\u914d\u7f6e\u65f6\uff0c\u6b64\u914d\u7f6e\u751f\u6548 servicecomb.flowcontrol.Provider.qps.bucket.[ServiceName].[Schema].[operation] \u4e24\u500dlimit\u5927\u5c0f\uff0c\u4e0d\u8d85\u8fc7max int (0,2147483647]\uff0c\u6574\u578b \u5426 \u4ee4\u724c\u6876\u573a\u666f\u4e0b\u6876\u7684\u5927\u5c0f \u652f\u6301microservice/schema/operation\u4e09\u4e2a\u7ea7\u522b\u7684\u914d\u7f6e\uff0c\u540e\u8005\u7684\u4f18\u5148\u7ea7\u9ad8\u4e8e\u524d\u8005 servicecomb.flowcontrol.Provider.qps.global.bucket \u4e24\u500dlimit\u5927\u5c0f\uff0c\u4e0d\u8d85\u8fc7max int (0,2147483647]\uff0c\u6574\u578b \u5426 \u4ee4\u724c\u6876\u573a\u666f\u4e0bprovider\u6876\u7684\u5927\u5c0f \u6ca1\u6709\u5177\u4f53\u7684\u6d41\u63a7\u914d\u7f6e\u65f6\uff0c\u6b64\u914d\u7f6e\u751f\u6548 <p>\u6ce8\u610f\uff1a strategy\u662f\u5168\u5c40\u7684\u7b56\u7565\u9009\u62e9\uff0c\u4e00\u65e6\u9009\u62e9\u6240\u6709\u6d41\u63a7\u63a5\u53e3\u90fd\u4f1a\u5e94\u7528\u7edf\u4e00\u7684\u6d41\u63a7\u7b56\u7565\uff0c\u4e14\u4e0d\u652f\u6301\u52a8\u6001\u914d\u7f6e\u53d8\u66f4\uff0c\u5982\u679c\u53d8\u66f4\u6d41\u63a7\u7b56\u7565\u9700\u8981\u91cd\u542f\u670d\u52a1\u3002</p> <p>\u6ce8\u610f\uff1a provider\u7aef\u9650\u6d41\u7b56\u7565\u914d\u7f6e\u4e2d\u7684<code>ServiceName</code>\u6307\u7684\u662f\u8c03\u7528\u8be5provider\u7684consumer\uff0c\u800c<code>schema</code>\u3001<code>operation</code>\u6307\u7684\u662fprovider\u81ea\u8eab\u7684\u3002\u5373provider\u7aef\u9650\u6d41\u914d\u7f6e\u7684\u542b\u4e49\u662f\uff0c\u9650\u5236\u6307\u5b9aconsumer\u8c03\u7528\u672cprovider\u7684\u67d0\u4e2aschema\u3001operation\u7684\u6d41\u91cf\u3002</p> <p><code>ANY</code> \u662f\u4e00\u4e2a\u7279\u6b8a\u7684 <code>ServiceName</code>\uff0c \u8868\u793a\u4e0d\u533a\u5206\u6765\u6e90\u5fae\u670d\u52a1\uff0c \u5bf9\u6240\u6709\u5fae\u670d\u52a1\u4f7f\u7528\u540c\u6837\u7684\u7b56\u7565\u3002 \u6bd4\u5982 <code>servicecomb.flowcontrol.Provider.qps.limit.ANY.mySchema.myOperation=200</code> \u8868\u793a\u5bf9 <code>mySchema.myOperation</code> \u5355\u72ec\u9650\u5236 200 \u7684\u6d41\u91cf\u3002</p>"},{"location":"references-handlers/ratelimit.html#consumer","title":"Consumer\u7aef\u4f7f\u7528\u9650\u6d41","text":"<p>\u7528\u6237\u5728consumer\u7aef\u4f7f\u7528\u9650\u6d41\u7b56\u7565\uff0c\u53ef\u4ee5\u9650\u5236\u53d1\u5f80\u6307\u5b9a\u5fae\u670d\u52a1\u7684\u8bf7\u6c42\u7684\u9891\u7387\u3002</p>"},{"location":"references-handlers/ratelimit.html#_4","title":"\u914d\u7f6e\u8bf4\u660e","text":"\u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u53d6\u503c\u8303\u56f4 \u662f\u5426\u5fc5\u9009 \u542b\u4e49 \u6ce8\u610f servicecomb.flowcontrol.Consumer.qps.enabled true Boolean \u5426 \u662f\u5426\u542f\u7528Consumer\u6d41\u63a7 - servicecomb.flowcontrol.strategy FixedWindow FixedWindow/LeakyBucket/TokenBucket/\u81ea\u5b9a\u4e49 \u5426 \u6d41\u63a7\u7b56\u7565 - servicecomb.flowcontrol.Consumer.qps.global.limit 2147483647\uff08max int\uff09 (0,2147483647]\uff0c\u6574\u578b \u5426 consumer\u53d1\u9001\u8bf7\u6c42\u6d41\u91cf\u7684\u5168\u5c40\u914d\u7f6e \u6ca1\u6709\u5177\u4f53\u7684\u6d41\u63a7\u914d\u7f6e\u65f6\uff0c\u6b64\u914d\u7f6e\u751f\u6548 servicecomb.flowcontrol.Consumer.qps.limit.[ServiceName].[Schema].[operation] 2147483647 (max int) (0,2147483647]\uff0c\u6574\u578b \u5426 \u6bcf\u79d2\u949f\u5141\u8bb8\u7684\u8bf7\u6c42\u6570 \u652f\u6301microservice\u3001schema\u3001operation\u4e09\u4e2a\u7ea7\u522b\u7684\u914d\u7f6e servicecomb.flowcontrol.Consumer.qps.global.bucket \u4e24\u500dlimit\u5927\u5c0f\uff0c\u4e0d\u8d85\u8fc7max int (0,2147483647]\uff0c\u6574\u578b \u5426 \u4ee4\u724c\u6876\u573a\u666f\u4e0bconsumer\u6876\u7684\u5927\u5c0f \u6ca1\u6709\u5177\u4f53\u7684\u6d41\u63a7\u914d\u7f6e\u65f6\uff0c\u6b64\u914d\u7f6e\u751f\u6548 servicecomb.flowcontrol.Consumer.qps.bucket.[ServiceName].[Schema].[operation] \u4e24\u500dlimit\u5927\u5c0f\uff0c\u4e0d\u8d85\u8fc7max int (0,2147483647]\uff0c\u6574\u578b \u5426 \u4ee4\u724c\u6876\u573a\u666f\u4e0b\u6876\u7684\u5927\u5c0f \u652f\u6301microservice/schema/operation\u4e09\u4e2a\u7ea7\u522b\u7684\u914d\u7f6e\uff0c\u540e\u8005\u7684\u4f18\u5148\u7ea7\u9ad8\u4e8e\u524d\u8005 <p>\u6ce8\u610f\uff1a strategy\u662f\u5168\u5c40\u7684\u7b56\u7565\u9009\u62e9\uff0c\u4e00\u65e6\u9009\u62e9\u6240\u6709\u6d41\u63a7\u63a5\u53e3\u90fd\u4f1a\u5e94\u7528\u7edf\u4e00\u7684\u6d41\u63a7\u7b56\u7565\uff0c\u4e14\u4e0d\u652f\u6301\u52a8\u6001\u914d\u7f6e\u53d8\u66f4\uff0c\u5982\u679c\u53d8\u66f4\u6d41\u63a7\u7b56\u7565\u9700\u8981\u91cd\u542f\u670d\u52a1\u3002</p> <p>\u6ce8\u610f\uff1a consumer\u7aef\u9650\u6d41\u7b56\u7565\u914d\u7f6e\u4e2d\u7684<code>ServiceName</code>\u3001<code>schema</code>\u3001<code>operation</code> \u6307\u7684\u662f\u8bf7\u6c42\u7684\u76ee\u6807\u670d\u52a1\u3002</p> <p><code>ANY</code> \u662f\u4e00\u4e2a\u7279\u6b8a\u7684 <code>ServiceName</code>\uff0c \u8868\u793a\u4e0d\u533a\u5206\u6765\u6e90\u5fae\u670d\u52a1\uff0c \u5bf9\u6240\u6709\u5fae\u670d\u52a1\u4f7f\u7528\u540c\u6837\u7684\u7b56\u7565\u3002 \u6bd4\u5982 <code>servicecomb.flowcontrol.Consumer.qps.limit.ANY.mySchema.myOperation=200</code> \u8868\u793a\u5bf9 <code>mySchema.myOperation</code> \u5355\u72ec\u9650\u5236 200 \u7684\u6d41\u91cf\u3002 \u5982\u679c\u4e0d\u540c\u5fae\u670d\u52a1\u5b58\u5728\u4e00\u6837\u7684 <code>schema</code>\u3001<code>operation</code>\uff0c \u5219\u5171\u4eab\u4e00\u4e2a\u6d41\u91cf\u63a7\u5236\u3002<code>ANY</code> \u5728 Consumer \u6d41\u63a7\u5f88\u5c11\u4f7f\u7528\u3002</p>"},{"location":"references-handlers/router.html","title":"\u7070\u5ea6\u53d1\u5e03","text":"<p>\u4f7f\u7528\u7070\u5ea6\u53d1\u5e03\u53ef\u4ee5\u5b9e\u73b0\u7248\u672c\u7684\u96f6\u4e2d\u65ad\u5347\u7ea7\u3002\u5047\u8bbe\u5fae\u670d\u52a1A\u5f53\u524d\u662fv1\u7248\u672c\uff0cv1\u7248\u672c\u5b58\u5728\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u73b0\u5728\u9700\u8981\u5347\u7ea7\u5230\u5230v2\u7248\u672c\u3002\u9996\u5148\u914d\u7f6e\u4e00\u4e2a\u7070\u5ea6 \u53d1\u5e03\u89c4\u5219\uff0c\u5c06100%\u7684\u6d41\u91cf\u6307\u5411v1\u7248\u672c\uff1b\u914d\u7f6e\u89c4\u5219\u751f\u6548\u540e\uff0c\u90e8\u7f72v2\u7248\u672c\uff1bv2\u7248\u672c\u542f\u52a8\u5b8c\u6bd5\uff0c\u914d\u7f6e10%\u7684\u6d41\u91cf\u5230v2\u7248\u672c\uff1b\u5f53v2\u7248\u672c \u8fd0\u884c\u7a33\u5b9a\uff0c\u914d\u7f6e100%\u7684\u6d41\u91cf\u5230v2\u7248\u672c\uff1b\u505c\u6b62v1\u7248\u672c\u7684\u5b9e\u4f8b\u3002</p> <ul> <li>\u524d\u63d0\u6761\u4ef6\uff1a\u7070\u5ea6\u53d1\u5e03\u4f9d\u8d56\u8d1f\u8f7d\u5747\u8861\u7ba1\u7406\u6a21\u5757\uff0c \u53c2\u8003\u8d1f\u8f7d\u5747\u8861 \u3002 </li> </ul> \u914d\u7f6e\u9879\u540d \u63cf\u8ff0 servicecomb.routeRule.[targetService] \u76ee\u6807\u670d\u52a1\u7684\u8def\u7531\u7ba1\u7406\u89c4\u5219 servicecomb.router.type \u586b\u5199'router' <p>\u7070\u5ea6\u53d1\u5e03\u89c4\u5219\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb: \n router:\n type: router\n routeRule:\n business: |\n - precedence: 2\n match:\n apiPath:\n prefix: \"/business/v2\"\n route:\n - weight: 100\n tags:\n version: 2.0.0\n - precedence: 1\n match:\n apiPath:\n prefix: \"/business/v1/dec\"\n route:\n - weight: 50\n tags:\n version: 1.1.0\n - weight: 50\n tags:\n version: 2.0.0\n\n</code></pre>"},{"location":"references-handlers/router.html#_2","title":"\u89c4\u5219\u8bf4\u660e","text":"<ul> <li>\u5339\u914d\u7279\u5b9a\u8bf7\u6c42\u7531match\u914d\u7f6e, match\u7684\u914d\u7f6e\u903b\u8f91\u548c \u6d41\u91cf\u7279\u5f81\u6cbb\u7406 \u4e00\u81f4\u3002</li> <li>\u8f6c\u53d1\u6743\u91cd\u5b9a\u4e49\u5728routeRule.{targetServiceName}.route\u4e0b\uff0c\u7531weight\u914d\u7f6e\uff0cweight\u6570\u503c\u8868\u793a\u767e\u5206\u6570\uff0c\u9700\u8981\u6ee1\u8db3\u52a0\u548c\u7b49\u4e8e100\uff0c\u4e0d\u6ee1\u8db3100\u7684\u90e8\u5206\u4f1a\u7528\u6700\u65b0\u7248\u672c\u586b\u5145\u3002</li> <li>\u670d\u52a1\u5206\u7ec4\u5b9a\u4e49\u5728routeRule.{targetServiceName}.route\u4e0b\uff0c\u7531tags\u914d\u7f6e\uff0c\u914d\u7f6e\u5185\u5bb9\u6709version\u548capp\u3002</li> <li>\u4f18\u5148\u7ea7\u6570\u91cf\u8d8a\u5927\u4f18\u5148\u7ea7\u8d8a\u9ad8\u3002</li> </ul>"},{"location":"references-handlers/router.html#_3","title":"\u5339\u914d\u6d41\u7a0b","text":"<p>\u5bf9\u4e8e\u4e0a\u9762\u7684\u793a\u4f8b\u914d\u7f6e\uff0c\u6240\u6709\u8bbf\u95eeprovider\u670d\u52a1\u7684\u8bf7\u6c42\uff0c\u9996\u5148\u5c1d\u8bd5\u4e0e\u4f18\u5148\u7ea7\u4e3a2\u7684\u7b2c\u4e00\u4e2a\u7684match\u89c4\u5219\u8fdb\u884c\u5339\u914d header\uff1aheader\u5b58\u5728key\u4e3aregion\u7684\u6309\u7167\u6b63\u5219\u89c4\u5219\u533a\u5206\u5927\u5c0f\u5199\u5339\u914d\uff0c\u5b58\u5728key\u4e3atype\u7684\u8fdb\u884c\u5b57\u7b26\u4e32\u7cbe\u51c6\u5339\u914d\u3002\u82e5\u5339\u914d match\u6210\u529f\u5219\u6309\u7167route\u7684\u914d\u7f6e\u5206\u914d100%\u7684\u6d41\u91cf\u5230version\u548ctags\u5bf9\u5e94\u7684\u5b9e\u4f8b\u3002\u82e5\u5339\u914dmatch\u5931\u8d25\u5219\u8fdb\u5165\u4e0b\u4e2a\u4f18\u5148\u7ea7\u4e3a1\u7684\u89c4\u5219\u3002\u4e0d\u540c\u89c4\u5219\u4f18\u5148\u7ea7\u4e0d\u80fd\u76f8\u7b49\u3002</p>"},{"location":"references-handlers/router.html#_4","title":"\u5f02\u5e38\u60c5\u51b5\u7684\u5904\u7406","text":"<p>\u5982\u679c\u56e0\u4e3a\u89c4\u5219\u914d\u7f6e\u9519\u8bef\uff0c\u6216\u8005\u6ca1\u6709match\u5230\u4efb\u4f55\u4e00\u6761\u89c4\u5219\uff0c\u6d41\u91cf\u4f1a\u76f4\u63a5\u8df3\u8fc7\u7070\u5ea6\u89c4\u5219\uff0c\u76f8\u5f53\u4e8e\u6ca1\u6709\u7070\u5ea6\u53d1\u5e03\u914d\u7f6e\u3002</p> <p>\u5982\u679c\u5df2\u7ecf\u5339\u914d\u4e86match\uff0c\u56e0\u4e3a\u5bf9\u5e94\u7684version\u6216\u8005tags\u627e\u4e0d\u5230\u5b9e\u4f8b\uff0c\u5219\u5269\u4f59\u6d41\u91cf\u81ea\u52a8\u8f6c\u53d1\u5230\u76ee\u524d\u7684\u6700\u65b0\u7248\u672c\u3002</p>"},{"location":"references-handlers/rule-governance.html","title":"\u6d41\u91cf\u7279\u5f81\u6cbb\u7406","text":"<p>\u6d41\u91cf\u7279\u5f81\u6cbb\u7406\u65e8\u5728\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\uff0c\u9002\u5408\u4e0d\u540c\u8bed\u8a00\u3001\u4e0d\u540c\u5fae\u670d\u52a1\u5f00\u53d1\u6846\u67b6\u7684\u6cbb\u7406\u89c4\u5219\u3002\u6cbb\u7406\u89c4\u5219\u89c4\u5b9a\u4e86\u5fae\u670d\u52a1\u6cbb\u7406\u7684\u8fc7\u7a0b\u3001\u6cbb\u7406\u7684\u7b56\u7565\uff0c\u53ef\u4ee5\u4f7f\u7528\u4e0d\u540c\u7684\u5f00\u53d1\u6846\u67b6\u3001\u6280\u672f\u5b9e\u73b0\u6cbb\u7406\u89c4\u5219\u7ea6\u5b9a\u7684\u6cbb\u7406\u80fd\u529b\u3002</p> <p>\u5f00\u53d1\u8005\u53ef\u4ee5\u5728 Java Chassis, Spring Cloud, Go Chassis \u4e2d\u4f7f\u7528\u8be5\u529f\u80fd\u3002</p> <p>Java Chassis\u63d0\u4f9b\u4e86\u5b9e\u73b0 SDK\uff0c\u53ef\u4ee5\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u5f00\u53d1\u6846\u67b6\u3002SDK \u9ed8\u8ba4\u91c7\u7528 Resilience4j \u5b9e\u73b0\u6cbb\u7406\u8fc7\u7a0b\uff0c\u5e76\u5728\u89c4\u8303\u4e2d\u53c2\u8003\u5f15\u7528\u4e86\u5f88\u591a\u5176\u8bbe\u8ba1\u7406\u5ff5\u3002\u89c4\u8303\u6ca1\u6709\u7ea6\u675f\u6cbb\u7406\u8fc7\u7a0b\u7684\u5b9e\u73b0\u6846\u67b6\uff0c\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u4f7f\u7528\u5176\u4ed6\u7684\u6cbb\u7406\u6846\u67b6\u5b9e\u73b0\u6cbb\u7406\u8fc7\u7a0b\u3002 </p>"},{"location":"references-handlers/rule-governance.html#_2","title":"\u6982\u5ff5\u5b9a\u4e49","text":"<p>\u6d41\u91cf\u7279\u5f81\u6cbb\u7406\u53ef\u4ee5\u4ece\u4e24\u4e2a\u4e0d\u540c\u7684\u89d2\u5ea6\u8fdb\u884c\u63cf\u8ff0\u3002</p> <p>\u4ece\u7ba1\u7406\u6d41\u7a0b\u4e0a\uff0c\u53ef\u4ee5\u5206\u4e3a\u8fdb\u884c <code>\u4e1a\u52a1\u5b9a\u4e49</code> \u548c\u8bbe\u7f6e <code>\u6cbb\u7406\u89c4\u5219</code> \u4e24\u4e2a\u6b65\u9aa4\u3002\u7cfb\u7edf\u67b6\u6784\u5e08\u5c06\u8bf7\u6c42\u6d41\u91cf\u6839\u636e\u7279\u5f81\u6253\u4e0a\u6807\u8bb0\uff0c\u7528\u4e8e\u533a\u5206\u4e00\u4e2a\u6216\u8005\u4e00\u7ec4\u4ee3\u8868\u5177\u4f53\u542b\u4e49\u7684\u4e1a\u52a1\uff0c\u7136\u540e\u5bf9\u8fd9\u4e9b\u4e1a\u52a1\u8bbe\u7f6e\u6cbb\u7406\u89c4\u5219\u3002</p> <p>\u4ece\u5904\u7406\u8fc7\u7a0b\u4e0a\uff0c\u53ef\u4ee5\u5206\u4e3a <code>\u4e0b\u53d1\u914d\u7f6e</code> \u548c \u5e94\u7528 <code>\u6cbb\u7406\u89c4\u5219</code> \u4e24\u4e2a\u6b65\u9aa4\u3002 \u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u3001\u914d\u7f6e\u4e2d\u5fc3\u3001\u73af\u5883\u53d8\u91cf\u7b49\u5e38\u89c1\u7684\u914d\u7f6e\u7ba1\u7406\u624b\u6bb5\u4e0b\u53d1\u914d\u7f6e\u3002\u5fae\u670d\u52a1 SDK \u8d1f\u8d23\u8bfb\u53d6\u914d\u7f6e\uff0c\u89e3\u6790\u6cbb\u7406\u89c4\u5219\uff0c\u5b9e\u73b0\u6cbb\u7406\u6548\u679c\u3002</p> <ul> <li><code>\u4e1a\u52a1\u5b9a\u4e49</code></li> </ul> <p>\u53ef\u4ee5\u6839\u636e\u8bf7\u6c42\u7684\u7279\u5f81\u8fdb\u884c\u4e1a\u52a1\u5b9a\u4e49\u3002</p> <pre><code>servicecomb:\n matchGroup:\n userLoginAction: |\n matches:\n - apiPath:\n exact: \"/login\"\n method:\n - POST\n - headers:\n Authentication: \n prefix: Basic\n</code></pre> <p>\u6bd4\u5982\u4e0a\u9762\u7684\u793a\u4f8b\u5b9a\u4e49\u4e86\u4e00\u4e2a\u4e1a\u52a1 <code>userLoginAction</code>\uff0c\u5982\u679c\u6d41\u91cf\u7684 <code>apiPath=/login&amp;method=POST</code>\uff0c \u6216\u8005 \u8bf7\u6c42\u5934 <code>Authentication=Basic*</code> \u90a3\u4e48\u8ba4\u4e3a\u8fd9\u4e2a\u6d41\u91cf\u662f\u4e00\u4e2a\u767b\u9646\u64cd\u4f5c\u3002</p> <ul> <li><code>\u6cbb\u7406\u89c4\u5219</code></li> </ul> <p>\u5b9a\u4e49\u597d\u4e1a\u52a1\u540e\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4eec\u8bbe\u7f6e\u6cbb\u7406\u89c4\u5219\u3002</p> <pre><code>servicecomb:\n rateLimiting:\n userLoginAction: |\n rate: 100\n</code></pre> <p>\u6bd4\u5982\u4e0a\u9762\u7684\u793a\u4f8b\u8bbe\u7f6e <code>userLoginAction</code> \u7684\u9650\u6d41\u7b56\u7565\u662f 100 TPS\u3002 </p>"},{"location":"references-handlers/rule-governance.html#_3","title":"\u89c4\u8303\u53c2\u8003","text":""},{"location":"references-handlers/rule-governance.html#_4","title":"\u4e1a\u52a1\u5b9a\u4e49","text":"<pre><code>servicecomb:\n matchGroup:\n userLoginAction: |\n matches:\n - name: firstMatch\n apiPath:\n exact: \"/login/v1\"\n method:\n - POST\n headers:\n Authentication: \n prefix: Basic\n serviceName: exampleService\n - name: secondeMatch\n apiPath:\n exact: \"/login/v2\"\n method:\n - POST\n headers:\n Authentication: \n prefix: Basic\n serviceName: exampleService\n services: exampleService\n name: userLoginAction\n</code></pre> <p>\u4e00\u4e2a\u4e1a\u52a1\u5bf9\u5e94\u4e00\u4e2a Key\uff0c userLoginAction \u4e3a Key \u7684\u540d\u79f0\u3002 \u4e00\u4e2a\u4e1a\u52a1\u53ef\u4ee5\u5b9a\u4e49\u591a\u4e2a\u6807\u8bb0\u89c4\u5219\uff0c\u6bcf\u4e2a\u6807\u8bb0\u89c4\u5219\u91cc\u9762\u53ef\u4ee5\u5b9a\u4e49 <code>apiPath</code>, <code>method</code>, <code>headers</code>, <code>serviceName</code> \u7b49\u5339\u914d\u89c4\u5219\u3002 \u4e0d\u540c\u6807\u8bb0\u89c4\u5219\u662f\u6216\u7684\u5173\u7cfb\uff0c\u5339\u914d\u89c4\u5219\u662f\u4e0e\u7684\u5173\u7cfb\u3002</p> <ul> <li> <p><code>services</code>: \u53ef\u9009\u3002\u6307\u51fa\u8fd9\u4e2a\u4e1a\u52a1\u5b9a\u4e49\u7684\u751f\u6548\u8303\u56f4\u3002 \u5728\u5e94\u7528\u7cfb\u7edf\u4e2d\uff0c\u4e1a\u52a1\u5b9a\u4e49\u53ef\u80fd\u5bf9\u4e8e\u6240\u6709\u5fae\u670d\u52a1\u90fd\u662f\u53ef\u89c1\u7684\uff08\u5982\u679c\u4e1a\u52a1\u5b9a\u4e49\u53ea\u4e0b\u53d1\u5230\u8be5\u5fae\u670d\u52a1\uff0c\u5219\u4e0d\u9700\u8981\u8fd9\u4e2a\u914d\u7f6e\uff09\uff0c\u4e00\u4e2a\u5fae\u670d\u52a1\u53ea\u4f1a\u542f\u7528 <code>services</code> \u5305\u542b\u81ea\u5df1\u7684\u89c4\u5219\u3002\u8fd9\u4e2a\u5c5e\u6027\u53ef\u9009\uff0c\u8868\u793a\u8fd9\u6761\u89c4\u5219\u9ed8\u8ba4\u751f\u6548\u3002\u53ef\u4ee5\u4f7f\u7528 <code>example:1.0.0</code> \u683c\u5f0f\u6307\u660e\u670d\u52a1\u548c\u7248\u672c\uff0c\u591a\u4e2a\u670d\u52a1\u7528\u9017\u53f7\u5206\u9694\uff0c\u6bd4\u5982\uff1a<code>foo:1.0.0,bar</code>\u3002</p> </li> <li> <p><code>name</code>: \u53ef\u9009\u3002\u4e1a\u52a1\u5b9a\u4e49\u7684\u540d\u79f0\u3002</p> </li> </ul> <p>\u5728match\u4e2d\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u7b97\u5b50\u6765\u5bf9 <code>apiPath</code> \u6216\u8005 <code>headers</code> \u8fdb\u884c\u5339\u914d. </p> <ul> <li><code>exact</code>: \u7cbe\u786e\u5339\u914d</li> <li><code>prefix</code>: \u524d\u7f00\u5339\u914d</li> <li><code>suffix</code>: \u540e\u7f00\u5339\u914d</li> <li><code>contains</code>: \u5305\u542b\uff0c \u76ee\u6807\u5b57\u7b26\u4e32\u662f\u5426\u5305\u542b\u6a21\u5f0f\u5b57\u7b26\u4e32</li> <li><code>compare</code>: \u6bd4\u8f83\uff1a \u652f\u6301 &gt;,&lt;,&gt;=,&lt;=,=,!= \u7b26\u53f7\u5339\u914d\uff0c\u5904\u7406\u65f6\u4f1a\u628a\u6a21\u5f0f\u5b57\u7b26\u4e32\u548c\u76ee\u6807\u5b57\u7b26\u4e32\u8f6c\u5316\u4e3a Double \u7c7b\u578b\u8fdb\u884c\u6bd4\u8f83\uff0c\u652f\u6301\u7684\u6570\u636e\u8303\u56f4\u4e3a Double \u7684\u6570\u636e\u8303\u56f4\u3002\u5728\u8fdb\u884c = \u548c != \u5224\u65ad\u65f6 \uff0c \u5982\u679c\u4e8c\u8005\u7684\u5dee\u503c\u5c0f\u4e8e1e-6\u5c31\u89c6\u4e3a\u76f8\u7b49\u3002\u4f8b\u5982\u6a21\u5f0f\u4e32\u4e3a: &gt;-10 \u4f1a\u5bf9\u5927\u4e8e-10\u4ee5\u4e0a\u7684\u76ee\u6807\u4e32\u5339\u914d\u6210\u529f\u3002</li> </ul> <p>\u4e1a\u52a1\u5b9a\u4e49\u53ef\u4ee5\u5728\u4e0d\u540c\u7684\u5e94\u7528\u5c42\u5b9e\u73b0\uff0c\u6bd4\u5982\u5728\u63d0\u4f9b REST \u63a5\u53e3\u7684\u670d\u52a1\u7aef\uff0c\u53ef\u4ee5\u901a\u8fc7 <code>HttpServletRequest</code> \u83b7\u53d6\u8bf7\u6c42\u4fe1\u606f\u3002\u5728 RestTemplate \u8c03\u7528\u7684\u5ba2\u6237\u7aef\uff0c\u53ef\u4ee5\u4ece <code>RestTemplate</code> \u83b7\u53d6\u8bf7\u6c42\u4fe1\u606f\u3002\u4e0d\u540c\u7684\u6846\u67b6\u548c\u5e94\u7528\u5c42\uff0c\u63d0\u53d6\u4fe1\u606f\u7684\u65b9\u5f0f\u4e0d\u4e00\u6837\u3002 \u5b9e\u73b0\u5c42\u901a\u8fc7\u5c06\u7279\u5f81\u6620\u5c04\u5230 <code>GovernanceRequest</code> \u6765\u5c4f\u853d\u8fd9\u4e9b\u5dee\u5f02\uff0c\u4f7f\u5f97\u5728\u4e0d\u540c\u7684\u6846\u67b6\uff0c\u4e0d\u540c\u7684\u5e94\u7528\u5c42\u90fd\u53ef\u4ee5\u4f7f\u7528\u6cbb\u7406\u3002</p> <pre><code>public class GovernanceRequest {\n /**\n headers with this request, maybe null.\n For provider: headers indicates the request headers to me.\n For consumer: headers indicates the request headers to the target.\n */\n private Map&lt;String, String&gt; headers;\n\n /**\n uri with this request, maybe null.\n For provider: uri indicates the request uri to me.\n For consumer: uri indicates the request uri to the target.\n */\n private String uri;\n\n /**\n method with this request, maybe null.\n For provider: method indicates the request method to me.\n For consumer: method indicates the request method to the target.\n */\n private String method;\n\n /**\n instance id with this request, maybe null.\n For provider: instanceId indicates who calls me.\n For consumer: instanceId indicates the target instance.\n */\n private String instanceId;\n\n /**\n microservice id (microservice name or application name + microservice name) with this request, maybe null.\n For provider: serviceName indicates who calls me.\n For consumer: serviceName indicates the target service.\n */\n private String serviceName;\n}\n\n</code></pre>"},{"location":"references-handlers/rule-governance.html#_5","title":"\u9650\u6d41","text":"<pre><code>servicecomb:\n rateLimiting:\n userLoginAction: |\n timeoutDuration: 0\n limitRefreshPeriod: 1000\n rate: 1\n</code></pre> <p>\u89c4\u5219\u89e3\u91ca\uff1a\u9650\u6d41\u89c4\u5219\u501f\u9274\u4e86<code>Resilience4j</code>\u7684\u601d\u60f3\uff0c\u5176\u539f\u7406\u4e3a\uff1a \u6bcf\u9694limitRefreshPeriod\u7684\u65f6\u95f4\u4f1a\u52a0\u5165limitForPeriod\uff08\u5373rate\uff09\u4e2a\u65b0\u8bb8\u53ef\uff0c\u5982\u679c\u83b7\u53d6\u4e0d\u5230\u65b0\u7684\u8bb8\u53ef(\u5df2\u7ecf\u89e6\u53d1\u9650\u6d41)\uff0c\u5f53\u524d\u7ebf\u7a0b\u4f1apark\uff0c\u6700\u591a\u7b49\u5f85timeoutDuration\u7684\u65f6\u95f4\uff0c\u9ed8\u8ba4\u5355\u4f4d\u4e3a\u6beb\u79d2\u3002</p>"},{"location":"references-handlers/rule-governance.html#header","title":"\u57fa\u4e8eheader\u7684\u9650\u6d41","text":"<pre><code>servicecomb:\n identifierRateLimiting:\n userLoginAction: |\n timeoutDuration: 0\n limitRefreshPeriod: 1000\n rate: 1\n identifier: user-id\n</code></pre> <p>\u57fa\u4e8eheader\u7684\u9650\u6d41\u548c\u9650\u6d41\u542b\u4e49\u7c7b\u4f3c\uff0c\u5b83\u4f1a\u9488\u5bf9 <code>identifier</code> \u6307\u5b9a\u7684 header \u503c\uff0c \u6bcf\u4e2a\u503c\u521b\u5efa\u4e00\u4e2a\u9650\u6d41\u5668\u3002</p>"},{"location":"references-handlers/rule-governance.html#_6","title":"\u91cd\u8bd5","text":"<pre><code>servicecomb:\n retry:\n userLoginAction: |\n maxAttempts: 3\n retryOnSame: 0\n retryOnResponseStatus: \n - 502\n - 503\n waitDuration: 1\n</code></pre> <p>\u89c4\u5219\u89e3\u91ca\uff1a\u91cd\u8bd5\u89c4\u5219\u501f\u9274\u4e86<code>Resilience4j</code>\u7684\u601d\u60f3\uff0c\u5176\u539f\u7406\u4e3a\uff1a\u5982\u679c\u54cd\u5e94\u7684\u9519\u8bef\u7801(502, 503)\u8ba1\u7b97\u7ed3\u679c\u6ee1\u8db3\u91cd\u8bd5\u6761\u4ef6\uff0c\u6216\u8005\u5f02\u5e38\u5728\u91cd\u8bd5\u5f02\u5e38\u6e05\u5355\u91cc\u9762\uff0c\u5219\u8fdb\u884c\u91cd\u8bd5\u3002\u4e0b\u4e00\u6b21\u91cd\u8bd5\u7b49\u5f85\u65f6\u95f4\u4e3a waitDuration\u3002 </p> <p>\u91cd\u8bd5\u7b49\u5f85\u65f6\u95f4\u548c\u5177\u4f53\u7684\u6846\u67b6\u4e0e\u8fd0\u884c\u673a\u5236\u6709\u5173\u3002\u91cd\u8bd5\u7b49\u5f85\u65f6\u95f4\u5fc5\u987b\u5927\u4e8e0\u3002</p>"},{"location":"references-handlers/rule-governance.html#_7","title":"\u7194\u65ad","text":"<pre><code>servicecomb:\n circuitBreaker:\n userLoginAction: |\n failureRateThreshold: 50\n slowCallRateThreshold: 100\n slowCallDurationThreshold: 60000\n minimumNumberOfCalls: 100\n slidingWindowType: COUNT_BASED\n slidingWindowSize: 100\n recordFailureStatus:\n - 502\n - 503\n waitDurationInOpenState: 60000\n permittedNumberOfCallsInHalfOpenState: 10\n forceClosed: false\n forceOpen: false\n</code></pre> <p>\u89c4\u5219\u89e3\u91ca\uff1a\u7194\u65ad\u89c4\u5219\u501f\u9274\u4e86<code>Resilience4j</code>\u7684\u601d\u60f3\uff0c\u5176\u539f\u7406\u4e3a\uff1a\u8fbe\u5230\u6307\u5b9a failureRateThreshold \u9519\u8bef\u7387\u6216\u8005 slowCallRateThreshold \u6162\u8bf7\u6c42\u7387\u65f6\u8fdb\u884c\u7194\u65ad\uff0c\u6162\u8bf7\u6c42\u901a\u8fc7 slowCallDurationThreshold \u5b9a\u4e49\u3002minimumNumberOfCalls \u662f\u8fbe\u5230\u7194\u65ad\u8981\u6c42\u7684\u6700\u4f4e\u8bf7\u6c42\u6570\u91cf\u95e8\u69db\u3002slidingWindowType\u6307\u5b9a\u6ed1\u52a8\u7a97\u53e3 \u7c7b\u578b\uff0c\u9ed8\u8ba4\u53ef\u9009 COUNT_BASED\u548cTIME_BASED \u5206\u522b\u662f\u57fa\u4e8e\u8bf7\u6c42\u6570\u91cf\u7a97\u53e3\u548c\u57fa\u4e8e\u65f6\u95f4\u7a97\u53e3\u3002slidingWindowSize \u6307\u5b9a\u7a97\u53e3\u5927\u5c0f\uff0c\u6839\u636e\u6ed1\u52a8\u7a97\u53e3\u7c7b\u578b\uff0c\u5355\u4f4d\u662f\u8bf7\u6c42\u6570\u91cf\u6216\u8005\u79d2\uff0c\u6839\u636e\u6ed1\u52a8\u7a97\u53e3\u7c7b\u578b\u51b3\u5b9a\u3002 forceClosed \u8868\u793a\u5f3a\u5236\u5173\u95ed\u7194\u65ad\u5668\uff0c\u5373\u7194\u65ad\u5668\u4e0d\u5de5\u4f5c\uff1bforceOpen\u8868\u793a\u5f3a\u5236\u5f00\u542f\u7194\u65ad\u5668\uff0c\u5373\u8bf7\u6c42\u90fd\u4f1a\u53d1\u751f\u7194\u65ad\u3002</p> <p>\u7194\u65ad\u65f6\u95f4\u662fwaitDurationInOpenState\uff0c\u8fbe\u5230\u65f6\u95f4\u4f1a\u653e\u901apermittedNumberOfCallsInHalfOpenState\u4e2a\u8bf7\u6c42\u3002\u653e\u901a\u540e\uff0c\u5982\u679c\u964d\u4f4e\u5230\u9608\u503c\u4e00\u4e0b\uff0c\u5219\u6062\u590d\uff1b\u5982\u679c\u6ca1\u6709\u964d\u4f4e\u5230\u9608\u503c\u4ee5\u4e0b\uff0c\u5219\u7ee7\u7eed\u9694\u79bb\u3002</p>"},{"location":"references-handlers/rule-governance.html#_8","title":"\u5b9e\u4f8b\u7ea7\u7194\u65ad","text":"<pre><code>servicecomb:\n instanceIsolation:\n userLoginAction: |\n failureRateThreshold: 50\n slowCallRateThreshold: 100\n slowCallDurationThreshold: 60000\n minimumNumberOfCalls: 100\n slidingWindowType: COUNT_BASED\n slidingWindowSize: 100\n recordFailureStatus:\n - 502\n - 503\n waitDurationInOpenState: 60000\n permittedNumberOfCallsInHalfOpenState: 10\n forceClosed: false\n forceOpen: false\n</code></pre> <p>\u5b9e\u4f8b\u7ea7\u7194\u65ad\u548c\u7194\u65ad\u7684\u542b\u4e49\u7c7b\u4f3c\uff0c\u4f46\u662f\u4ed6\u4f1a\u9488\u5bf9\u6bcf\u4e2a\u5b9e\u4f8b\u521b\u5efa\u4e00\u4e2a\u7194\u65ad\u5668\u3002Java Chassis\u4f1a\u76d1\u542c\u5b9e\u4f8b\u7194\u65ad\u4e8b\u4ef6\uff0c\u5e76\u8c03\u6574\u7194\u65ad\u5b9e\u4f8b\u7684\u4f18\u5148\u7ea7\uff0c\u964d\u4f4e\u5bf9\u7194\u65ad\u5b9e\u4f8b\u7684\u4f7f\u7528\u9891\u7387\u4ee5\u8fbe\u5230\u5b9e\u4f8b\u9694\u79bb\u7684\u4f5c\u7528\u3002</p>"},{"location":"references-handlers/rule-governance.html#_9","title":"\u9694\u79bb\u4ed3","text":"<pre><code>servicecomb:\n bulkhead:\n userLoginAction: |\n maxConcurrentCalls: 1000\n maxWaitDuration: 0\n</code></pre> <p>\u89c4\u5219\u89e3\u91ca\uff1a\u9694\u79bb\u4ed3\u89c4\u5219\u501f\u9274\u4e86<code>Resilience4j</code>\u7684\u601d\u60f3\uff0c\u5176\u539f\u7406\u4e3a\uff1a\u5f53\u6700\u5927\u5e76\u53d1\u6570\u8d85\u8fc7 maxConcurrentCalls\uff0c\u7b49\u5f85 maxWaitDuration \u7ade\u4e89\u8d44\u6e90\uff0c\u5982\u679c\u83b7\u5f97\u8d44\u6e90\uff0c\u5219\u7ee7\u7eed\u5904\u7406\uff0c\u5982\u679c\u83b7\u53d6\u4e0d\u5230\uff0c\u5219\u62d2\u7edd\u6267\u884c\u8bf7\u6c42\u3002\u5728\u5f02\u6b65\u6846\u67b6\uff0c\u5efa\u8bae maxWaitDuration \u8bbe\u7f6e\u4e3a0\uff0c\u9632\u6b62\u963b\u585e\u4e8b\u4ef6\u6d3e\u53d1\u7ebf\u7a0b\u3002</p>"},{"location":"references-handlers/rule-governance.html#_10","title":"\u5b9e\u4f8b\u7ea7\u9694\u79bb\u4ed3","text":"<pre><code>servicecomb:\n instanceBulkhead:\n userLoginAction: |\n maxConcurrentCalls: 1000\n maxWaitDuration: 0\n</code></pre> <p>\u5b9e\u4f8b\u7ea7\u9694\u79bb\u4ed3\u548c\u9694\u79bb\u4ed3\u7684\u542b\u4e49\u7c7b\u4f3c\uff0c\u4f46\u662f\u4ed6\u4f1a\u9488\u5bf9\u6bcf\u4e2a\u5b9e\u4f8b\u521b\u5efa\u4e00\u4e2a\u9694\u79bb\u4ed3\u3002</p>"},{"location":"references-handlers/rule-governance.html#_11","title":"\u9519\u8bef\u6ce8\u5165","text":"<pre><code>servicecomb:\n faultInjection:\n userLoginAction: |\n type: delay\n delayTime: 1000\n percentage: 50\n errorCode: 500\n fallbackType: ThrowException\n forceClosed: false\n</code></pre> <p>\u89c4\u5219\u89e3\u91ca\uff1a\u9519\u8bef\u6ce8\u5165\u5206\u4e3a <code>delay</code> \u548c <code>abort</code> \u4e24\u79cd\u3002<code>delay</code> \u8868\u793a\u5bf9\u4e8e <code>percentage</code> \u7684\u8bf7\u6c42\uff0c\u5ef6\u8fdf <code>delayTime</code>\u3002 <code>abort</code> \u8868\u793a\u5bf9\u4e8e <code>percentage</code> \u7684\u8bf7\u6c42\uff0c\u6839\u636e <code>fallbackType</code> \u629b\u51fa\u5f02\u5e38\u8fd8\u662f\u8fd4\u56de null\u3002 </p>"},{"location":"references-handlers/rule-governance.html#_12","title":"\u516c\u5171\u53c2\u6570","text":"<p>\u6cbb\u7406\u89c4\u5219\u5b58\u5728\u4e00\u4e9b\u516c\u5171\u53c2\u6570\uff0c \u6bd4\u5982 <code>services</code>, <code>order</code>, <code>name</code>\u3002\u6bd4\u5982\uff1a</p> <pre><code>servicecomb:\n faultInjection:\n userLoginAction: |\n type: delay\n delayTime: 1000\n percentage: 50\n errorCode: 500\n fallbackType: ThrowException\n forceClosed: false\n services: helloService\n order: 1\n name: userLoginAction\n</code></pre> <ul> <li>services: \u8868\u793a\u8be5\u6cbb\u7406\u89c4\u5219\u751f\u6548\u7684\u5fae\u670d\u52a1\u540d\u79f0\u5217\u8868\u3002 \u5728\u5e94\u7528\u7cfb\u7edf\u4e2d\uff0c\u6cbb\u7406\u89c4\u5219\u53ef\u80fd\u5bf9\u4e8e\u6240\u6709\u5fae\u670d\u52a1\u90fd\u662f\u53ef\u89c1\u7684\uff08\u5982\u679c\u6cbb\u7406\u89c4\u5219\u53ea\u4e0b\u53d1\u5230\u8be5\u5fae\u670d\u52a1\uff0c\u5219\u4e0d\u9700\u8981\u8fd9\u4e2a\u914d\u7f6e\uff09\uff0c\u4e00\u4e2a\u5fae\u670d\u52a1\u53ea\u4f1a\u542f\u7528 <code>services</code> \u5305\u542b\u81ea\u5df1\u7684\u89c4\u5219\u3002\u8fd9\u4e2a\u5c5e\u6027\u53ef\u9009\uff0c\u8868\u793a\u8fd9\u6761\u89c4\u5219\u9ed8\u8ba4\u751f\u6548\u3002\u53ef\u4ee5\u4f7f\u7528 <code>example:1.0.0</code> \u683c\u5f0f\u6307\u660e\u670d\u52a1\u548c\u7248\u672c\uff0c\u591a\u4e2a\u670d\u52a1\u7528\u9017\u53f7\u5206\u9694\uff0c\u6bd4\u5982\uff1a<code>foo:1.0.0,bar</code>\u3002</li> <li>order: \u8868\u793a\u8be5\u6cbb\u7406\u89c4\u5219\u7684\u4f18\u5148\u7ea7\uff0c\u503c\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8\u3002 \u5f53\u4e00\u4e2a\u8bf7\u6c42\u5339\u914d\u591a\u4e2a\u6cbb\u7406\u89c4\u5219\u7684\u65f6\u5019\uff0c\u6309\u7167\u4f18\u5148\u7ea7\u4f7f\u7528\u4f18\u5148\u7ea7\u9ad8\u7684\u6cbb\u7406\u89c4\u5219\u3002</li> <li>name: \u8868\u793a\u8be5\u6cbb\u7406\u89c4\u5219\u7684\u540d\u79f0\uff0c\u7cfb\u7edf\u5185\u90e8\u4f7f\u7528\u5c5e\u6027\uff0c\u5176\u503c\u7b49\u4e8e\u89c4\u5219\u91cc\u9762\u7684\u4e1a\u52a1\u540d\u79f0\uff0c\u7528\u6237\u4e0d\u80fd\u4fee\u6539\u3002</li> </ul>"},{"location":"registry/distributed.html","title":"\u8f7b\u91cf\u5316\u914d\u7f6e\u4e2d\u5fc3 zero-config","text":"<p>zero-config\u662fJava Chassis\u63d0\u4f9b\u7684\u8f7b\u91cf\u5316\u670d\u52a1\u4e2d\u5fc3\uff0c\u4ee5\u652f\u6301\u5728\u5c0f\u89c4\u6a21\u7684\u5e94\u7528\u573a\u666f\u4e0b\uff0c\u4e0d\u5fc5\u4e13\u95e8\u90e8\u7f72\u72ec\u7acb\u7684\u670d\u52a1\u4e2d\u5fc3\u3002</p> <p>zero-config\u652f\u6301\u591a\u79cd\u5de5\u4f5c\u6a21\u5f0f\uff1a</p> <ul> <li> <p>local \u5355\u673a\u6a21\u5f0f\uff0c\u6ca1\u6709\u5b9e\u4f8b\u52a8\u6001\u53d1\u73b0\u80fd\u529b\uff0c\u6240\u6709\u7684\u670d\u52a1\u8c03\u7528\uff0c\u90fd\u4f7f\u7528\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\u673a\u5236\u5904\u7406\u3002</p> </li> <li> <p>multicast \u4f7f\u7528UDP\u591a\u64ad\u53d1\u9001\u5fae\u670d\u52a1\u6ce8\u518c\u4fe1\u606f\uff0c\u9002\u7528\u4e8e\u6240\u6709\u5fae\u670d\u52a1\u5b9e\u4f8b\u90fd\u5728\u540c\u4e00\u4e2a\u5b50\u7f51\u5185\u7684\u573a\u666f\uff0c\u6bcf\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\u90fd\u76f8\u5f53\u4e8e\u662f\u4e00\u4e2a\u670d\u52a1\u4e2d\u5fc3\u5b9e\u4f8b\u3002</p> </li> </ul> <p>\u4f7f\u7528 zero-config\uff0c \u9700\u8981\u5728\u9879\u76ee\u4e2d\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-zero-config&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre>"},{"location":"registry/distributed.html#zero-config_1","title":"zero-config \u76f8\u5173\u914d\u7f6e","text":"<p>\u914d\u7f6e\u524d\u7f00\uff1a <code>servicecomb.registry.zero-config</code></p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 enabled true \u662f\u5426\u4f7f\u7528zero-config\u670d\u52a1\u4e2d\u5fc3\u529f\u80fd mode multicast \u5de5\u4f5c\u6a21\u5f0f\uff0c\u5185\u7f6emulticast\u548clocal\u6a21\u5f0f heartbeat.interval 30s \u53d1\u9001\u6ce8\u518c/\u5fc3\u8df3\u6d88\u606f\u7684\u95f4\u9694 heartbeat.lost-times 3 \u5fc3\u8df3\u4e22\u5931\u8d85\u8fc7\u6307\u5b9a\u7684\u6b21\u6570\uff0c\u5219\u5220\u9664\u76f8\u5e94\u7684\u5b9e\u4f8b pull-interval 3s consumer\u6d41\u7a0b\u66f4\u65b0\u76ee\u6807\u5b9e\u4f8b\u7684\u95f4\u9694 multicast.address 0.0.0.0:6666 UDP\u7684\u672c\u5730bind\u5730\u5740\uff0c \u5bf9\u4e8e\u4e0d\u5141\u8bb8bind 0.0.0.0\u7684\u573a\u666f\uff0c\u9700\u8981\u4fee\u6539\u672c\u914d\u7f6e\u9879\u3002\u6ce8\u610f\uff1a \u76f8\u5e94\u7684\u7f51\u5361\u8981\u6253\u5f00UDP multicast\u529f\u80fd multicast.group 225.6.7.8 UDP multicast\u591a\u64adgroup\u5730\u5740\uff0c\u6839\u636e\u6807\u51c6\uff0c\u5408\u6cd5\u5730\u5740\u8303\u56f4\u4e3a(224.0.0.0, 239.255.255.255]\u3002\u5f00\u53d1\u9636\u6bb5\uff0c\u4e3a\u907f\u514d\u4e0d\u540c\u5f00\u53d1\u4eba\u5458\u4e4b\u95f4\u4ea7\u751f\u73af\u5883\u4e92\u76f8\u5e72\u6270\uff0c \u53ef\u4ee5\u5404\u81ea\u8bbe\u7f6e\u4e0d\u540c\u7684group\u5730\u5740 <p>\u793a\u4f8b\uff1a</p> <pre><code>servicecomb:\n registry:\n zero-config:\n enable: true\n mode: multicast\n heartbeat:\n interval: 30s\n lost-times: 3\n pull-interval: 3s\n multicast:\n address: 0.0.0.0:6666\n group: 225.6.7.8\n</code></pre>"},{"location":"registry/introduction.html","title":"\u6ce8\u518c\u53d1\u73b0\u4ecb\u7ecd","text":"<p>\u91c7\u7528\u7f51\u7edc\u63a5\u53e3\u8fdb\u884c\u901a\u4fe1\uff0c\u5e76\u4e14\u652f\u6301\u591a\u5b9e\u4f8b\u5f39\u6027\u6269\u7f29\u5bb9\u662f\u5fae\u670d\u52a1\u4e00\u4e2a\u91cd\u8981\u7684\u7279\u5f81\u3002 \u4e00\u4e2a\u5fae\u670d\u52a1 A \u9700\u8981\u548c\u53e6\u5916\u4e00\u4e2a\u5fae\u670d\u52a1 B \u8fdb\u884c \u901a\u4fe1\uff0c\u9996\u5148\u9700\u8981\u77e5\u9053\u5fae\u670d\u52a1 B \u7684\u7f51\u7edc\u5730\u5740\u4fe1\u606f\uff0c \u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u822c\u662f\u901a\u8fc7\u6ce8\u518c\u53d1\u73b0\u5b9e\u73b0\u7684\u3002 </p> <p>\u6700\u5e38\u89c1\u7684\u670d\u52a1\u53d1\u73b0\u673a\u5236\u662f\u5f15\u5165\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u670d\u52a1\uff0c \u5fae\u670d\u52a1 B \u542f\u52a8\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5411\u4e2d\u95f4\u4ef6\u670d\u52a1\u6ce8\u518c\u81ea\u5df1\u7684\u7f51\u7edc\u5730\u5740\u4fe1\u606f\uff0c\u5fae\u670d\u52a1 A \u8bbf\u95ee B \u7684\u65f6\u5019\uff0c \u9996\u5148\u4ece\u4e2d\u95f4\u4ef6\u670d\u52a1\u67e5\u8be2\u5fae\u670d\u52a1 B \u7684\u7f51\u7edc\u5730\u5740\u4fe1\u606f\u3002</p> <p>\u5bf9\u4e8e\u89c4\u6a21\u8f83\u5c0f\u7684\u7cfb\u7edf\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u4f7f\u7528\u4e2d\u95f4\u4ef6\u670d\u52a1\uff0c\u800c\u662f\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u7684\u65b9\u5f0f\uff0c\u5728\u5fae\u670d\u52a1 A \u4e2d\u6307\u5b9a\u5fae\u670d\u52a1 B \u7684\u5730\u5740\u3002\u8fd9\u79cd\u65b9\u5f0f \u9002\u5408\u7ec4\u7f51\u60c5\u51b5\u56fa\u5b9a\uff0c\u4e0d\u4f1a\u5f39\u6027\u6269\u7f29\u5bb9\u7684\u573a\u666f\u3002</p> <p>\u5728\u5c40\u57df\u7f51\u73af\u5883\u4e0b\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u7ec4\u64ad\u534f\u8bae\uff0c\u6bd4\u5982 mDNS \u53d1\u73b0\u5176\u4ed6\u7684\u670d\u52a1\uff0c\u8fd9\u79cd\u65b9\u5f0f\u4e0d\u9700\u8981\u505a\u989d\u5916\u7684\u914d\u7f6e\u3002</p>"},{"location":"registry/introduction.html#_2","title":"\u6ce8\u518c\u53d1\u73b0\u4fe1\u606f","text":"<p>Java Chassis\u5b9a\u4e86\u4e86\u51e0\u4e2a\u7ef4\u5ea6\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u6ce8\u518c\u53d1\u73b0\u548c\u914d\u7f6e\u7ba1\u7406\u90fd\u56f4\u7ed5\u8fd9\u51e0\u4e2a\u6838\u5fc3\u6982\u5ff5\u6765\u7ec4\u7ec7\u3002</p> <ul> <li>\u73af\u5883 environment</li> <li>\u5e94\u7528 application </li> <li>\u5fae\u670d\u52a1\u540d\u79f0 name</li> <li>\u5fae\u670d\u52a1\u7248\u672c version </li> <li>\u5b9e\u4f8b\u5730\u5740\u4fe1\u606f Endpoints\uff0c\u4e00\u4e2a\u5b9e\u4f8b\u53ef\u4ee5\u5305\u542b\u591a\u4e2a\u534f\u8bae\u7684 Endpoint\u3002 </li> </ul> <p>\u6b64\u5916\u8fd8\u5305\u62ec\u5951\u7ea6(schema\uff09\u3002 \u5951\u7ea6\u662fJava Chassis\u6cbb\u7406\u7ba1\u63a7\u7684\u57fa\u7840\u3002 </p> <p>\u8fd9\u4e9b\u57fa\u672c\u4fe1\u606f\u901a\u8fc7 yaml \u6587\u4ef6\u8fdb\u884c\u914d\u7f6e\uff1a</p> <pre><code>servicecomb:\n service:\n application: basic-application\n name: gateway\n version: 0.0.1\n\n rest:\n address: 0.0.0.0:9090?sslEnabled=false\n</code></pre>"},{"location":"registry/introduction.html#_3","title":"\u540c\u65f6\u4f7f\u7528\u591a\u4e2a\u6ce8\u518c\u53d1\u73b0","text":"<p>\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u591a\u4e2a\u6ce8\u518c\u53d1\u73b0\u7684\u5b9e\u73b0\u3002\u7ec4\u5408\u4e0d\u540c\u7684\u6ce8\u518c\u53d1\u73b0\u7684\u5b9e\u73b0\uff0c\u80fd\u591f\u6ee1\u8db3\u4e00\u4e9b\u975e\u5e38\u91cd\u8981\u573a\u666f\u7684\u9700\u6c42\u3002</p>"},{"location":"registry/introduction.html#_4","title":"\u4f7f\u7528\u591a\u4e2a\u670d\u52a1\u4e2d\u5fc3\u7684\u7ea6\u675f\u548c\u884c\u4e3a","text":"<ul> <li>\u670d\u52a1\u6ce8\u518c</li> </ul> <p>\u53ef\u4ee5\u5f80\u591a\u4e2a\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u6ce8\u518c\uff0c\u4e0d\u540c\u7684\u5b9e\u4f8b\u5728\u6ce8\u518c\u7684\u65f6\u5019\uff0c\u9700\u8981\u4fdd\u8bc1\u6bcf\u4e2a\u5b9e\u4f8b\uff08\u8fdb\u7a0b\uff09\u5177\u5907\u552f\u4e00\u7684\u5b9e\u4f8bID\uff0c\u5982\u679c\u5b9e\u4f8b\u91cd\u542f\uff0c\u9700\u8981\u751f\u6210\u65b0\u7684\u5b9e\u4f8bID\uff0c\u5373\u4f7f\u662f\u5728\u540c\u4e00\u4e2a\u7269\u7406\u4e3b\u673a\u3002</p> <ul> <li>\u670d\u52a1\u53d1\u73b0</li> </ul> <p>\u5b9e\u4f8bID\u76f8\u540c\u7684\u5fae\u670d\u52a1\u5b9e\u4f8b\uff0c\u4f1a\u88ab\u4f5c\u4e3a\u540c\u4e00\u4e2a\u5b9e\u4f8b\u8fdb\u884c\u7ba1\u7406\u3002\u5982\u679c\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\u5b9e\u4f8bID\u76f8\u540c\uff0c\u90a3\u4e48\u5fc5\u987b\u4fdd\u8bc1\u8fd9\u4e9b\u5b9e\u4f8b\u662f\u540c\u4e00\u4e2a\uff0c\u5426\u5219\u4f1a\u51fa\u73b0\u5b9e\u4f8b\u4e22\u5931\u6216\u8005\u8986\u76d6\u7684\u60c5\u51b5\u3002 </p>"},{"location":"registry/local-registry.html","title":"\u672c\u5730\u6ce8\u518c\u53d1\u73b0","text":"<p>\u672c\u5730\u6ce8\u518c\u53d1\u73b0\u662f\u4e00\u79cd\u9759\u6001\u7684\u670d\u52a1\u53d1\u73b0\u673a\u5236\u3002\u4f7f\u7528\u672c\u5730\u6ce8\u518c\u53d1\u73b0\uff0c\u9700\u8981\u5728\u9879\u76ee\u4e2d\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-local&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre> <p>\u672c\u5730\u670d\u52a1\u53d1\u73b0\u53ef\u4ee5\u5728\u5f88\u591a\u4e0d\u540c\u7684\u573a\u666f\u4f7f\u7528\uff0c\u80fd\u591f\u5e2e\u52a9\u5f00\u53d1\u8005\u89e3\u51b3\u5f88\u591a\u7cfb\u7edf\u96c6\u6210\u95ee\u9898\uff0c\u6bd4\u5982\u548c\u7f51\u5173\u7684\u96c6\u6210\uff0c\u548c\u7b2c\u4e09\u65b9\u670d\u52a1\u7684\u96c6\u6210\u3002</p>"},{"location":"registry/local-registry.html#_2","title":"\u6ce8\u518c\u8fc7\u7a0b","text":"<p>\u548c\u4f7f\u7528\u670d\u52a1\u4e2d\u5fc3\u4e00\u6837\uff0c \u7cfb\u7edf\u4f1a\u81ea\u52a8\u5b8c\u6210\u6ce8\u518c\u3002\u7cfb\u7edf\u4f1a\u4ece\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bfb\u53d6\u672c\u5fae\u670d\u52a1\u7684\u4fe1\u606f\u548c\u5b9e\u4f8b\u4fe1\u606f\uff0c\u4ee5\u53ca\u672c\u5fae\u670d\u52a1\u53d1\u5e03\u7684 \u5951\u7ea6\u4fe1\u606f\uff0c\u5c06\u4fe1\u606f\u6ce8\u518c\u5230\u5185\u5b58\u4e2d\u3002</p>"},{"location":"registry/local-registry.html#_3","title":"\u53d1\u73b0\u8fc7\u7a0b","text":"<p>\u53d1\u73b0\u8fc7\u7a0b\u4e5f\u662f\u4ece\u672c\u5730\u8fdb\u884c\u67e5\u627e\u3002\u56e0\u6b64\u7cfb\u7edf\u9700\u8981\u914d\u7f6e\u672c\u5730\u7684\u5fae\u670d\u52a1\u4fe1\u606f\u548c\u5b9e\u4f8b\u4fe1\u606f\uff0c\u4ee5\u53ca\u5951\u7ea6\u4fe1\u606f\u3002 \u63d0\u4f9b\u4e86\u4e0b\u9762\u4e24\u79cd\u65b9\u5f0f\uff1a</p> <ul> <li>\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u7684\u65b9\u5f0f\u5b9a\u4e49\u670d\u52a1</li> </ul> <p>\u8fd9\u79cd\u65b9\u5f0f\u4ece\u914d\u7f6e\u6587\u4ef6(registry.yaml)\u4e2d\u8bfb\u53d6\u670d\u52a1\u7684 <code>Microservice</code> \u548c <code>MicroserviceInstance</code> \u4fe1\u606f\uff0c\u4ece\u76ee\u5f55 <code>microservices/{serviceName}/{schemaId}.yaml</code> \u6216\u8005 <code>applications/{appId}/{serviceName}/{schemaId}.yaml</code> \u8bfb\u53d6\u5fae\u670d\u52a1\u7684\u5951\u7ea6 \u4fe1\u606f\u3002</p> <p>registry.yaml \u683c\u5f0f\uff1a</p> <pre><code> ```yaml\n ms1:\n - id: \"001\"\n version: \"1.0\"\n appid: exampleApp\n environment: development\n schemaIds:\n - hello\n instances:\n - endpoints:\n - rest://127.0.0.1:8080\n - id: \"002\"\n version: \"2.0\"\n environment: development\n appid: exampleApp\n schemaIds:\n - hello\n instances:\n - endpoints:\n - rest://127.0.0.2:8080\n ms2:\n - id: \"003\"\n version: \"1.0\"\n environment: development\n appid: exampleApp\n schemaIds:\n - hello\n instances:\n - endpoints:\n - rest://127.0.0.1:8081\n ```\n</code></pre> <p><code>registry.yaml</code> \u6307\u5b9a\u4e86\u5fae\u670d\u52a1\u7684\u57fa\u672c\u4fe1\u606f\uff1a\u5e94\u7528ID (appId)\uff0c \u5fae\u670d\u52a1\u540d\u79f0 (serviceName), \u5fae\u670d\u52a1\u7248\u672c(version)\uff0c\u73af\u5883(environment) \u548c\u5951\u7ea6\uff1b\u5fae\u670d\u52a1\u5b9e\u4f8b\u57fa\u672c\u4fe1\u606f\uff1a\u7f51\u7edc\u5730\u5740(endpoints)\u3002</p> <ul> <li>\u4f7f\u7528 <code>bean</code> \u7684\u65b9\u5f0f\u5b9a\u4e49\u670d\u52a1<pre><code>```java\n @Bean\n public RegistryBean demoLocalRegistryServerBean2() {\n List&lt;String&gt; endpoints = new ArrayList&lt;&gt;();\n endpoints.add(\"rest://localhost:8080\");\n List&lt;Instance&gt; instances = new ArrayList&lt;&gt;();\n instances.add(new Instance().setEndpoints(endpoints));\n\n return new RegistryBean()\n .setServiceName(\"demo-local-registry-server-bean2\")\n .setId(\"003\")\n .setVersion(\"0.0.3\")\n .setAppId(\"demo-local-registry\")\n .addSchemaInterface(\"CodeFirstEndpoint2\", CodeFirstService.class)\n .setInstances(new Instances().setInstances(instances));\n }\n```\n</code></pre> </li> </ul> <p><code>RegistryBean</code> \u7684\u4fe1\u606f\u548c <code>registry.yaml</code> \u7684\u4fe1\u606f\u7c7b\u4f3c\uff0c \u53ef\u4ee5\u6dfb\u52a0 <code>Schema Interface</code> \u6765\u6dfb\u52a0 \u5951\u7ea6\u4fe1\u606f\uff0c \u5982\u679c\u6ca1\u6709\u6dfb\u52a0\u5951\u7ea6\u4fe1\u606f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u4e5f\u4f1a\u4ece\u672c\u5730\u914d\u7f6e\u6587\u4ef6\u67e5\u627e\u5951\u7ea6\u3002 CodeFirstService \u662f\u4e00\u4e2a\u63a5\u53e3\uff0c \u548c\u666e\u901a\u7684 provider \u63a5\u53e3\u5b9a\u4e49\u7c7b\u4f3c\uff1a</p> <pre><code> @Path(\"/register/url/codeFirst\")\n @Produces(\"application/json\")\n public interface CodeFirstService {\n @GET\n @Path(\"getName\")\n String getName(@QueryParam(\"name\") String name);\n }\n</code></pre>"},{"location":"registry/local-registry.html#-","title":"\u672c\u5730\u6ce8\u518c\u53d1\u73b0\u7684\u5e94\u7528 - \u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1","text":"<p>\u53ef\u4ee5\u6709\u975e\u5e38\u591a\u7684\u65b9\u5f0f\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\uff0c\u6bd4\u5982\u91c7\u7528\u7b2c\u4e09\u65b9\u63d0\u4f9b\u7684 Rest Client\u3002 \u4f46\u662f\u9700\u8981\u63d0\u4f9b\u4e00\u79cd \u900f\u660e\u7684\u65b9\u5f0f\uff0c\u8ba9\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\u7684\u5ba2\u6237\u7aef\u4ee3\u7801\u548c\u8c03\u7528 servicecomb \u5fae\u670d\u52a1\u7684 \u5ba2\u6237\u7aef\u4ee3\u7801\u98ce\u683c\u5b8c\u5168\u4e00\u6837\uff0c\u5e76\u4e14\u62e5\u6709\u6240\u6709 servicecomb \u7684\u5ba2\u6237\u7aef\u6cbb\u7406\u80fd\u529b\u3002</p> <p>\u5728\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\u91cc\u9762\u4ecb\u7ecd\u4e86servicecomb\u63d0\u4f9b\u7684\u4e00\u79cd \u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u4f9d\u8d56\u4e8e\u4f7f\u7528\u670d\u52a1\u4e2d\u5fc3\u4f5c\u4e3a\u6ce8\u518c\u53d1\u73b0\u3002 \u53ef\u4ee5\u770b\u51fa\u4f7f\u7528\u672c\u5730\u670d\u52a1\u53d1\u73b0\u80fd\u591f\u975e\u5e38\u65b9\u4fbf\u7684\u8c03\u7528\u7b2c\u4e09\u65b9\u670d\u52a1\u3002</p> <p>\u53ea\u9700\u8981\u5728\u539f\u6765\u7684\u9879\u76ee\u4e2d\u5f15\u5165\u672c\u5730\u6ce8\u518c\u53d1\u73b0\uff0c\u6309\u7167\u4e0a\u8ff0\u4e24\u79cd\u65b9\u5f0f\u4e4b\u4e00\u5b9a\u4e49\u7b2c\u4e09\u65b9\u670d\u52a1\u7684\u4fe1\u606f\u3002 \u5b9a\u4e49\u5b8c\u6210\u540e\uff0c\u53ef\u4ee5\u50cf\u8bbf\u95ee servicecomb \u670d\u52a1\u4e00\u6837\u8bbf\u95ee\u7b2c\u4e09\u65b9\u670d\u52a1\uff0c\u4e0d\u7528\u5173\u5fc3\u7b2c\u4e09\u65b9\u670d\u52a1\u662f\u91c7\u7528\u4ec0\u4e48\u6846\u67b6\u5f00\u53d1\u7684\u3002 \u4e0b\u9762\u4ee3\u7801\u7247\u6bb5\u6765\u6e90\u4e8e demo\uff0c \u6f14\u793a\u4e86\u901a\u8fc7 java chassis \u7684\u65b9\u5f0f\u8c03\u7528\u670d\u52a1\u4e2d\u5fc3\u63a5\u53e3\u3002</p> <pre><code>public interface IServiceCenterEndpoint {\n // java name can not be `x-domain-name`, so interfaces define all parameters.\n @GetMapping(path = \"/instances\")\n Object getInstances(@RequestParam(name = \"appId\") String appId,\n @RequestParam(name = \"serviceName\") String serviceName,\n @RequestParam(name = \"global\") String global,\n @RequestParam(name = \"version\") String version,\n @RequestHeader(name = \"x-domain-name\") String domain);\n}\n\n@Component\npublic class ServiceCenterTestCase implements CategorizedTestCase {\n @RpcReference(microserviceName = \"thirdParty-service-center\", schemaId = \"ServiceCenterEndpoint\")\n IServiceCenterEndpoint serviceCenterEndpoint;\n\n @Override\n public void testRestTransport() throws Exception {\n // invoke service-center(3rd-parties)\n @SuppressWarnings(\"unchecked\")\n Map&lt;String, List&lt;?&gt;&gt; result = (Map&lt;String, List&lt;?&gt;&gt;) serviceCenterEndpoint.getInstances(\n \"demo-multi-registries\",\n \"demo-multi-registries-server\",\n \"true\",\n \"0.0.2\",\n \"default\");\n TestMgr.check(result.get(\"instances\").size(), 1);\n }\n}\n</code></pre>"},{"location":"registry/nacos.html","title":"\u4f7f\u7528 Nacos","text":"<p>\u53ef\u4ee5\u901a\u8fc7 Nacos\u5b98\u7f51 \u4e0b\u8f7d\u548c\u5b89\u88c5 Nacos\u3002</p> <p>Nacos\u7684namespace\u5bf9\u5e94\u4e8e\u73af\u5883Environment\uff0c group\u5bf9\u5e94\u4e8eapplication\uff0c service\u5bf9\u5e94\u4e8e\u5fae\u670d\u52a1\u540d\u79f0\u3002 </p> <ul> <li>\u88681-1 \u8bbf\u95eeNacos\u5e38\u7528\u7684\u914d\u7f6e\u9879</li> </ul> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u662f\u5426\u5fc5\u9009 \u542b\u4e49 servicecomb.registry.nacos.enabled true \u662f \u662f\u5426\u542f\u7528\u3002 servicecomb.registry.nacos.serverAddr http://127.0.0.1:8848 \u662f \u670d\u52a1\u4e2d\u5fc3\u7684\u5730\u5740\u4fe1\u606f\uff0c\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a\uff0c\u7528\u9017\u53f7\u5206\u9694\u3002 servicecomb.registry.nacos.metadata \u7a7a \u5426 \u914d\u7f6eString\u7684\u952e\u503c\u5bf9\u3002 servicecomb.registry.nacos.username \u7a7a \u5426 Nacos\u7528\u6237\u540d servicecomb.registry.nacos.password \u7a7a \u5426 Nacos\u5bc6\u7801 servicecomb.registry.nacos.accessKey \u7a7a \u5426 Nacos Access Key servicecomb.registry.nacos.secretKey \u7a7a \u5426 Nacos Secret Key servicecomb.registry.nacos.clusterName DEFAULT \u5426 Nacos Cluster Name <p>\u4f7f\u7528Nacos\u9700\u8981\u786e\u4fdd\u4e0b\u9762\u7684\u8f6f\u4ef6\u5305\u5f15\u5165\uff1a</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-nacos&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre>"},{"location":"registry/service-center.html","title":"\u4f7f\u7528 Service Center","text":"<p>ServcieComb Service Center \u63d0\u4f9b\u4e86\u5b8c\u5907\u7684\u6ce8\u518c\u53d1\u73b0\u673a\u5236\uff0c \u662f Java Chassis \u7f3a\u7701\u4f7f\u7528\u7684\u6ce8\u518c\u53d1\u73b0\u673a\u5236\u3002 </p> <p>\u670d\u52a1\u4e2d\u5fc3\u652f\u6301\u4f7f\u7528 <code>PULL</code> \u548c <code>PUSH</code> \u4e24\u79cd\u6a21\u5f0f\u901a\u77e5\u5b9e\u4f8b\u53d8\u5316\uff0c \u5f00\u53d1\u8005\u53ef\u4ee5\u914d\u7f6e\u670d\u52a1\u4e2d\u5fc3\u96c6\u7fa4\u5730\u5740\u3001\u8fde\u63a5\u53c2\u6570\u4ee5\u53ca\u5fc3\u8df3\u7ba1\u7406\u7b49\u3002</p> <ul> <li>\u88681-1 \u8bbf\u95ee\u670d\u52a1\u4e2d\u5fc3\u5e38\u7528\u7684\u914d\u7f6e\u9879</li> </ul> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u662f\u5426\u5fc5\u9009 \u542b\u4e49 servicecomb.registry.sc.enabled true \u662f \u662f\u5426\u542f\u7528\u3002 servicecomb.registry.sc.address http://127.0.0.1:30100 \u662f \u670d\u52a1\u4e2d\u5fc3\u7684\u5730\u5740\u4fe1\u606f\uff0c\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a\uff0c\u7528\u9017\u53f7\u5206\u9694\u3002 servicecomb.registry.sc.watch false \u5426 \u662f\u5426\u91c7\u7528PUSH\u6a21\u5f0f\u76d1\u542c\u5b9e\u4f8b\u53d8\u5316\u3002\u4e3afalse\u7684\u65f6\u5019\u8868\u793a\u4f7f\u7528PULL\u6a21\u5f0f\u3002 servicecomb.registry.sc.autodiscovery false \u5426 \u662f\u5426\u81ea\u52a8\u53d1\u73b0\u670d\u52a1\u4e2d\u5fc3\u7684\u5730\u5740\u3002\u5f53\u9700\u8981\u914d\u7f6e\u90e8\u5206\u5730\u5740\uff0c\u5176\u4ed6\u5730\u5740\u7531\u914d\u7f6e\u7684\u670d\u52a1\u4e2d\u5fc3\u5b9e\u4f8b\u53d1\u73b0\u7684\u65f6\u5019\uff0c\u5f00\u542f\u8fd9\u4e2a\u914d\u7f6e\u3002 servicecomb.registry.sc.healthCheckIntervalInSeconds 30 \u5426 \u5fc3\u8df3\u95f4\u9694\u3002 servicecomb.registry.sc.healthCheckTimes 3 \u5426 \u5141\u8bb8\u7684\u5fc3\u8df3\u5931\u8d25\u6b21\u6570\u3002\u5f53\u8fde\u7eed\u7b2ctimes+1\u6b21\u5fc3\u8df3\u4ecd\u7136\u5931\u8d25\u65f6\u5219\u5b9e\u4f8b\u88absc\u4e0b\u7ebf\u3002\u5373interval * (times + 1)\u51b3\u5b9a\u4e86\u5b9e\u4f8b\u88ab\u81ea\u52a8\u6ce8\u9500\u7684\u65f6\u95f4\u3002\u5982\u679c\u670d\u52a1\u4e2d\u5fc3\u7b49\u5f85\u8fd9\u4e48\u957f\u7684\u65f6\u95f4\u6ca1\u6709\u6536\u53d6\u5230\u5fc3\u8df3\uff0c\u4f1a\u6ce8\u9500\u5b9e\u4f8b\u3002 <p>\u4f7f\u7528\u670d\u52a1\u4e2d\u5fc3\u9700\u8981\u786e\u4fdd\u4e0b\u9762\u7684\u8f6f\u4ef6\u5305\u5f15\u5165\uff1a</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-service-center&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre>"},{"location":"registry/service-center.html#rbac","title":"\u4f7f\u7528 RBAC \u8ba4\u8bc1","text":"<p>\u670d\u52a1\u4e2d\u5fc3\u652f\u6301RBAC\u8ba4\u8bc1\uff0c\u670d\u52a1\u4e2d\u5fc3\u5f00\u542fRBAC\u8ba4\u8bc1\u4e4b \u540e\uff0c\u5ba2\u6237\u7aef\u8c03\u7528\u670d\u52a1\u4e2d\u5fc3\u63a5\u53e3\u90fd\u9700\u8981\u5148\u83b7\u53d6token\uff0c\u4fdd\u8bc1\u670d\u52a1\u7684\u5b89\u5168\u53ef\u4fe1\u3002 \u4f7f\u7528 RBAC \u8ba4\u8bc1\uff0c \u9700\u8981\u4f7f\u7528 2.1.3 \u53ca\u5176\u4ee5\u4e0a\u7684\u7248\u672c\u3002 </p> <ul> <li>\u670d\u52a1\u914d\u7f6e</li> </ul> <p>\u4f7f\u7528 RBAC \u8ba4\u8bc1\uff0c\u9700\u8981\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u589e\u52a0\u5982\u4e0b\u914d\u7f6e\u9879\uff0c \u6307\u5b9a\u8fde\u63a5\u670d\u52a1\u4e2d\u5fc3\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\uff1a</p> <pre><code> ```\n servicecomb:\n credentials:\n rbac.enabled: true # \u4f7f\u7528\u542f\u7528 RBAC\uff0c \u9ed8\u8ba4\u4e3a false\n account:\n name: root #\u670d\u52a1\u4e2d\u5fc3\u652f\u6301\u7684\u7528\u6237\u540d\n password: your-password #\u7528\u6237\u540d\u5bf9\u5e94\u7684\u5bc6\u7801\n cipher: default #\u8d26\u53f7\u5bc6\u7801\u52a0\u89e3\u5bc6\u7528\u7684\u7b97\u6cd5\u5b9e\u73b0\u7c7b\n ```\n</code></pre> <p>\u8d26\u53f7\u5bc6\u7801\u90fd\u662f\u654f\u611f\u4fe1\u606f\uff0c\u4e00\u822c\u9700\u8981\u52a0\u5bc6\u4fdd\u5b58\uff0c\u4f7f\u7528\u7684\u65f6\u5019\u518d\u89e3\u5bc6\uff0cJava Chassis \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6269\u5c55\u673a\u5236\uff0c\u7528\u6237\u53ea\u9700\u8981\u5b9e\u73b0\u63a5\u53e3 <code>org.apache.servicecomb.foundation.auth.Cipher</code>\uff0c\u5e76\u6ce8\u518c\u6210Spring Bean\uff0c\u5c31\u4f1a\u81ea\u52a8\u88ab\u4f7f\u7528\uff0c\u63a5\u53e3\u91cc\u9762\u5305\u542b\u4e24\u4e2a\u65b9\u6cd5\uff1a</p> <pre><code> ```java\n String name();\n\n char[] decrypt(char[] encrypted);\n ```\n</code></pre> <p>name\u65b9\u6cd5\u8fd4\u56decipher\u7684\u540d\u79f0\uff0c\u5bf9\u5e94 <code>servicecomb.credentials.cipher</code> \u7684\u914d\u7f6e\uff0cdecrypt\u662f\u89e3\u5bc6\u63a5\u53e3\uff0c\u7528\u6237\u540d\u3001\u5bc6\u7801\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u4f1a\u8c03\u7528\u8fd9\u4e2a\u65b9\u6cd5\u8fdb\u884c\u89e3\u5bc6\u3002 \u4e0b\u9762\u7ed9\u4e86\u4e00\u4e2a\u6700\u7b80\u5355\u7684base64\u7f16\u89e3\u7801\u7684\u5b9e\u73b0\u793a\u4f8b\uff0c\u7528\u6237\u4f7f\u7528base64\u7f16\u7801\u628a\u8d26\u53f7\u5bc6\u7801\u914d\u7f6e\u5230\u914d\u7f6e\u6587\u4ef6\u5373\u53ef\u3002</p> <p>\u6ce8\u610f: base64 \u5e76\u4e0d\u662f\u5b89\u5168\u52a0\u5bc6\u7b97\u6cd5\uff0c\u8bf7\u52ff\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u3002 </p> <pre><code> ```yaml\n servicecomb:\n credentials:\n account:\n name: cm9vdA==\n password: eW91ci1wYXNzd29yZCA=\n cipher: base64\n ```\n\n ```java\n import java.util.Base64;\n\n import org.apache.servicecomb.foundation.auth.Cipher;\n import org.springframework.stereotype.Component;\n\n /**\n * Base64\u89e3\u7801\u5b9e\u73b0\n */\n @Component\n public class Base64Cipher implements Cipher {\n @Override\n public String name() {\n return \"base64\";\n }\n\n @Override\n public char[] decrypt(char[] encrypted) {\n return new String(Base64.getDecoder().decode(new String(encrypted))).toCharArray();\n }\n }\n ```\n</code></pre>"},{"location":"registry/service-center.html#aksk","title":"\u4f7f\u7528 AK/SK \u8ba4\u8bc1","text":"<p>\u534e\u4e3a\u4e91\u5fae\u670d\u52a1\u5f15\u64ce\u4e13\u4e1a\u7248\u7684\u670d\u52a1\u4e2d\u5fc3\u9700\u8981\u4f7f\u7528 AK/SK \u8ba4\u8bc1\uff0c \u4f7f\u7528 AK/SK \u8ba4\u8bc1\uff0c \u9700\u8981\u4f7f\u7528 2.1.3 \u53ca\u5176\u4ee5\u4e0a\u7684\u7248\u672c\u3002 AK/SK \u8ba4\u8bc1\u9700\u8981\u914d\u7f6e\u5982\u4e0b\u4fe1\u606f\uff1a</p> <pre><code>servciecomb:\n credentials:\n akskEnabled: true\n accessKey: your access key\n secretKey: your secrete key\n akskCustomCipher: default # \u52a0\u5bc6\u7b97\u6cd5\uff0c \u548c RBAC \u4e00\u6837\n project: cn-south-1 # \u9879\u76ee\u540d\u79f0\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u586b\u5199\n</code></pre> <p>secreteKey \u652f\u6301\u52a0\u5bc6\u5b58\u50a8\uff0c \u6269\u5c55\u65b9\u5f0f\u540c RBAC \u3002</p> <p>\u4f7f\u7528AK/SK \u9700\u8981\u4e0b\u9762\u7684\u8f6f\u4ef6\u5305\u5f15\u5165\uff1a</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;servicestage&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre> <p>\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f9d\u8d56\uff1a</p> <pre><code> &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;solution-basic&lt;/artifactId&gt;\n &lt;/dependency&gt;\n</code></pre>"},{"location":"registry/zookeeper.html","title":"\u4f7f\u7528 ZooKeeper","text":"<p>\u53ef\u4ee5\u901a\u8fc7 ZooKeeper\u5b98\u7f51 \u4e0b\u8f7d\u548c\u5b89\u88c5 ZooKeeper\u3002</p> <p>\u4f7f\u7528ZooKeeper\u9700\u8981\u786e\u4fdd\u4e0b\u9762\u7684\u8f6f\u4ef6\u5305\u5f15\u5165\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-zookeeper&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u88681-1 \u8bbf\u95eeZooKeeper\u5e38\u7528\u7684\u914d\u7f6e\u9879</li> </ul> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u662f\u5426\u5fc5\u9009 \u542b\u4e49 servicecomb.registry.zk.enabled true \u662f \u662f\u5426\u542f\u7528\u3002 servicecomb.registry.zk.connectString 127.0.0.1:2181 \u662f ZooKeeper\u7684\u5730\u5740\u4fe1\u606f\uff0c\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a\uff0c\u7528\u9017\u53f7\u5206\u9694\u3002 servicecomb.registry.zk.authenticationSchema \u7a7a \u5426 \u8ba4\u8bc1\u65b9\u5f0f\uff0c\u76ee\u524d\u53ea\u80fd\u914d\u7f6e\u4e3a digest\u3002 servicecomb.registry.zk.authenticationInfo \u7a7a \u5426 \u5f53\u8ba4\u8bc1\u65b9\u5f0f\u4e3a digest \u7684\u65f6\u5019\uff0c\u914d\u7f6e\u7528\u6237\u540d\u5bc6\u7801\u4fe1\u606f\uff0c\u6bd4\u5982: user:password servicecomb.registry.zk.connectionTimeoutMillis 1000 \u5426 \u8fde\u63a5\u8d85\u65f6\u65f6\u95f4 servicecomb.registry.zk.sessionTimeoutMillis 60000 \u5426 \u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4 servicecomb.registry.zk.enableSwaggerRegistration false \u5426 \u662f\u5426\u6ce8\u518c\u5951\u7ea6"},{"location":"registry/zookeeper.html#zookeeper_1","title":"ZooKeeper\u4f7f\u7528\u8ba4\u8bc1","text":"<p>ZooKeeper\u4f7f\u7528\u8ba4\u8bc1\u8be6\u7ec6\u60c5\u51b5\u53ef\u4ee5\u53c2\u8003\u5b98\u7f51\u3002\u8fd9\u91cc\u7ed9\u51fa\u6838\u5fc3\u91cd\u8981\u7684\u6b65\u9aa4\uff0c\u672c\u6b65\u9aa4\u57fa\u4e8eZookeeper 3.8.3\u7248\u672c\u8fdb\u884c\u9a8c\u8bc1\u3002 </p> <ol> <li> <p>\u4fee\u6539 zoo.cfg</p> <p>\u5728\u914d\u7f6e\u6587\u4ef6\u589e\u52a0\u3002\u5176\u4e2d <code>sessionRequireClientSASLAuth</code> \u6307\u5b9a\u4e86\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u591f\u8bbf\u95ee Zookeeper\u3002 </p> </li> </ol> <pre><code>authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider\nsessionRequireClientSASLAuth=true\n</code></pre> <ol> <li>\u4fee\u6539 java.env</li> </ol> <p>\u5728\u914d\u7f6e\u6587\u4ef6\u589e\u52a0\u3002 \u5176\u4e2d <code>file.conf</code> \u662f\u7b2c3\u6b65\u589e\u52a0\u7684\u6587\u4ef6\u8def\u5f84</p> <pre><code>SERVER_JVMFLAGS=\"-Djava.security.auth.login.config=/opt/file.conf\"\n</code></pre> <ol> <li> <p>\u589e\u52a0 file.conf</p> <p>\u914d\u7f6e\u6587\u4ef6\u6307\u5b9a\u5408\u6cd5\u7684\u767b\u5f55\u7528\u6237\u3002 </p> </li> </ol> <pre><code>Server {\n org.apache.zookeeper.server.auth.DigestLoginModule required\n user_super=\"adminsecret\"\n user_bob=\"bobsecret\";\n};\n</code></pre>"},{"location":"security/shi-yong-rsa-ren-zheng.html","title":"\u4f7f\u7528RSA\u8ba4\u8bc1","text":""},{"location":"security/shi-yong-rsa-ren-zheng.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7528\u6237\u901a\u8fc7\u7b80\u5355\u7684\u914d\u7f6e\u5373\u53ef\u542f\u7528\u670d\u52a1\u95f4RSA\u8ba4\u8bc1\uff0c\u4ee5\u4fdd\u969c\u670d\u52a1\u63a5\u53e3\u7684\u5b89\u5168\u6027\u3002</p> <p>\u8be6\u7ec6\u4ecb\u7ecd\u53c2\u8003\u516c\u94a5\u8ba4\u8bc1</p>"},{"location":"security/shi-yong-rsa-ren-zheng.html#consumer","title":"Consumer\u914d\u7f6e","text":"<ul> <li>\u5728pom.xml\u4e2d\u589e\u52a0\u4f9d\u8d56\uff1a</li> </ul> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt; \n &lt;artifactId&gt;handler-publickey-auth&lt;/artifactId&gt; \n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u5728microservice.yaml\u4e2d\u6dfb\u52a0\u8fdb\u5904\u7406\u94fe</li> </ul> <pre><code>servicecomb:\n handler:\n chain:\n Consumer:\n default: auth-consumer\n</code></pre>"},{"location":"security/shi-yong-rsa-ren-zheng.html#provider","title":"Provider\u914d\u7f6e","text":"<ul> <li>\u5728pom.xml\u4e2d\u589e\u52a0\u4f9d\u8d56\uff1a</li> </ul> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt; \n &lt;artifactId&gt;handler-publickey-auth&lt;/artifactId&gt; \n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u5728microservice.yaml\u4e2d\u6dfb\u52a0\u8fdb\u5904\u7406\u94fe</li> </ul> <pre><code>servicecomb:\n handler:\n chain:\n Provider:\n default: auth-provider\n</code></pre>"},{"location":"security/tls.html","title":"\u4f7f\u7528TLS\u901a\u4fe1","text":""},{"location":"security/tls.html#_1","title":"\u573a\u666f\u63cf\u8ff0","text":"<p>\u7528\u6237\u901a\u8fc7\u7b80\u5355\u7684\u914d\u7f6e\u5373\u53ef\u542f\u7528TLS\u901a\u4fe1\uff0c\u4ee5\u4fdd\u969c\u6570\u636e\u7684\u4f20\u8f93\u5b89\u5168\u3002</p>"},{"location":"security/tls.html#_2","title":"\u5916\u90e8\u670d\u52a1\u901a\u4fe1\u914d\u7f6e","text":"<p>\u4e0e\u5916\u90e8\u670d\u52a1\u901a\u4fe1\u76f8\u5173\u7684\u914d\u7f6e\u5199\u5728microservice.yaml\u6587\u4ef6\u4e2d\u3002</p> <ul> <li> <p>\u670d\u52a1\u4e2d\u5fc3\u3001\u914d\u7f6e\u4e2d\u5fc3TLS\u901a\u4fe1\u914d\u7f6e \u5fae\u670d\u52a1\u4e0e\u670d\u52a1\u4e2d\u5fc3\u3001\u914d\u7f6e\u4e2d\u5fc3\u7684\u8fde\u63a5\u53ef\u4ee5\u901a\u8fc7\u5c06http\u6539\u4e3ahttps\u542f\u7528TLS\u901a\u4fe1\uff0c\u914d\u7f6e\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n service:\n registry:\n address: https://127.0.0.1:30100\n config:\n client:\n serverUri: https://127.0.0.1:30103\n</code></pre> </li> <li> <p>\u670d\u52a1\u63d0\u4f9b\u8005\u542f\u7528TLS\u901a\u4fe1 \u670d\u52a1\u63d0\u4f9b\u8005\u5728\u914d\u7f6e\u670d\u52a1\u76d1\u542c\u5730\u5740\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u5728\u5730\u5740\u540e\u9762\u8ffd\u52a0<code>?sslEnabled=true</code>\u5f00\u542fTLS\u901a\u4fe1\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:8080?sslEnabled=true\n highway:\n address: 0.0.0.0:7070?sslEnabled=true\n</code></pre> </li> </ul>"},{"location":"security/tls.html#_3","title":"\u8bc1\u4e66\u914d\u7f6e","text":"<p>\u8bc1\u4e66\u914d\u7f6e\u9879\u5199\u5728microservice.yaml\u6587\u4ef6\u4e2d\uff0c\u652f\u6301\u7edf\u4e00\u5236\u5b9a\u8bc1\u4e66\uff0c\u4e5f\u53ef\u4ee5\u6dfb\u52a0tag\u8fdb\u884c\u66f4\u7ec6\u7c92\u5ea6\u7684\u914d\u7f6e\uff0c\u6709tag\u7684\u914d\u7f6e\u4f1a\u8986\u76d6\u5168\u5c40\u914d\u7f6e\uff0c\u914d\u7f6e\u683c\u5f0f\u5982\u4e0b\uff1a</p> <pre><code>ssl.[tag].[property]\n</code></pre> <p>\u5e38\u89c1\u7684tag\u5982\u4e0b\u8868\uff1a </p> \u9879\u76ee tag \u670d\u52a1\u4e2d\u5fc3 sc.consumer \u914d\u7f6e\u4e2d\u5fc3 cc.consumer \u770b\u677f\u4e2d\u5fc3 mc.consumer Rest\u670d\u52a1\u7aef rest.provider Highway\u670d\u52a1\u7aef highway.provider Rest\u5ba2\u6237\u7aef rest.consumer Highway\u5ba2\u6237\u7aef highway.consumer auth\u5ba2\u6237\u7aef apiserver.consumer \u4e00\u822c\u4e0d\u9700\u8981\u914d\u7f6etag\uff0c\u6b63\u5e38\u60c5\u51b5\u5206\u4e3a\u4e09\u7c7b\uff1a1\u3001\u8fde\u63a5\u5185\u90e8\u670d\u52a1 2\u3001\u4f5c\u4e3a\u670d\u52a1\u7aef 3\u3001\u4f5c\u4e3a\u5ba2\u6237\u7aef \u6240\u4ee5\u5982\u679c\u8fd9\u4e09\u7c7b\u8981\u6c42\u7684\u8bc1\u4e66\u4e0d\u4e00\u81f4\uff0c\u90a3\u4e48\u9700\u8981\u4f7f\u7528tag\u6765\u533a\u5206 <p>\u8bc1\u4e66\u914d\u7f6e\u9879\u89c1\u88681 \u8bc1\u4e66\u914d\u7f6e\u9879\u8bf4\u660e\u8868\u3002 \u88681 \u8bc1\u4e66\u914d\u7f6e\u9879\u8bf4\u660e\u8868</p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u53d6\u503c\u8303\u56f4 \u662f\u5426\u5fc5\u9009 \u542b\u4e49 \u6ce8\u610f ssl.engine jdk - \u5426 ssl\u534f\u8bae\uff0c\u63d0\u4f9bjdk/openssl\u9009\u62e9 \u9ed8\u8ba4\u4e3ajdk ssl.protocols TLSv1.2 - \u5426 \u534f\u8bae\u5217\u8868 \u4f7f\u7528\u9017\u53f7\u5206\u9694 ssl.ciphers TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - \u5426 \u7b97\u6cd5\u5217\u8868 \u4f7f\u7528\u9017\u53f7\u5206\u9694 ssl.authPeer false - \u5426 \u662f\u5426\u8ba4\u8bc1\u5bf9\u7aef - ssl.checkCN.host false - \u5426 \u662f\u5426\u5bf9\u8bc1\u4e66\u7684CN\u8fdb\u884c\u68c0\u67e5 \u8be5\u914d\u7f6e\u9879\u53ea\u5bf9Consumer\u7aef\uff0c\u5e76\u4e14\u4f7f\u7528http\u534f\u8bae\u6709\u6548\uff0c\u5373Consumser\u7aef\u4f7f\u7528rest\u901a\u9053\u6709\u6548\u3002\u5bf9\u4e8eProvider\u7aef\u3001highway\u901a\u9053\u7b49\u65e0\u6548\u3002\u68c0\u67e5CN\u7684\u76ee\u7684\u662f\u9632\u6b62\u670d\u52a1\u5668\u88ab\u9493\u9c7c\uff0c\u53c2\u8003\u6807\u51c6\u5b9a\u4e49\uff1ahttps://tools.ietf.org/html/rfc2818\u3002 ssl.trustStore trust.jks - \u5426 \u4fe1\u4efb\u8bc1\u4e66\u6587\u4ef6 - ssl.trustStoreType JKS - \u5426 \u4fe1\u4efb\u8bc1\u4e66\u7c7b\u578b - ssl.trustStoreValue - - \u5426 \u4fe1\u4efb\u8bc1\u4e66\u5bc6\u7801 - ssl.keyStore server.p12 - \u5426 \u8eab\u4efd\u8bc1\u4e66\u6587\u4ef6 - ssl.keyStoreType PKCS12 - \u5426 \u8eab\u4efd\u8bc1\u4e66\u7c7b\u578b - ssl.keyStoreValue - - \u5426 \u8eab\u4efd\u8bc1\u4e66\u5bc6\u7801 - ssl.crl revoke.crl - \u5426 \u540a\u9500\u8bc1\u4e66\u6587\u4ef6 - ssl.sslCustomClass - org.apache.servicecomb.foundation.ssl.SSLCustom\u7684\u5b9e\u73b0\u7c7b \u5426 SSLCustom\u7c7b\u7684\u5b9e\u73b0\uff0c\u7528\u4e8e\u5f00\u53d1\u8005\u8f6c\u6362\u5bc6\u7801\u3001\u6587\u4ef6\u8def\u5f84\u7b49\u3002 - <p>\u8bf4\u660e\uff1a</p> <ul> <li>\u9ed8\u8ba4\u7684\u534f\u8bae\u7b97\u6cd5\u662f\u9ad8\u5f3a\u5ea6\u52a0\u5bc6\u7b97\u6cd5\uff0cJDK\u9700\u8981\u5b89\u88c5\u5bf9\u5e94\u7684\u7b56\u7565\u6587\u4ef6\uff0c\u53c2\u8003\uff1ahttp://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html\u3002 \u60a8\u53ef\u4ee5\u5728\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u4f7f\u7528\u975e\u9ad8\u5f3a\u5ea6\u7b97\u6cd5\u3002</li> <li>\u5fae\u670d\u52a1\u6d88\u8d39\u8005\uff0c\u53ef\u4ee5\u9488\u5bf9\u4e0d\u540c\u7684\u63d0\u4f9b\u8005\u6307\u5b9a\u8bc1\u4e66\uff08\u5f53\u524d\u8bc1\u4e66\u662f\u6309\u7167HOST\u7b7e\u53d1\u7684\uff0c\u4e0d\u540c\u7684\u63d0\u4f9b\u8005\u90fd\u4f7f\u7528\u4e00\u4efd\u8bc1\u4e66\u5b58\u50a8\u4ecb\u8d28\uff0c\u8fd9\u4efd\u4ecb\u8d28\u540c\u65f6\u7ed9\u5fae\u670d\u52a1\u8bbf\u95ee\u670d\u52a1\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\u4f7f\u7528\uff09\u3002</li> </ul>"},{"location":"security/tls.html#_4","title":"\u793a\u4f8b\u4ee3\u7801","text":"<p>microservice.yaml\u6587\u4ef6\u4e2d\u542f\u7528TLS\u901a\u4fe1\u7684\u914d\u7f6e\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n service:\n registry:\n address: https://127.0.0.1:30100\n config:\n client:\n serverUri: https://127.0.0.1:30103\n rest:\n address: 0.0.0.0:8080?sslEnabled=true\n highway:\n address: 0.0.0.0:7070?sslEnabled=true\n\n#########SSL options\nssl.protocols: TLSv1.2\nssl.authPeer: true\nssl.checkCN.host: true\n\n#########certificates config\nssl.trustStore: trust.jks\nssl.trustStoreType: JKS\nssl.trustStoreValue: Changeme_123\nssl.keyStore: server.p12\nssl.keyStoreType: PKCS12\nssl.keyStoreValue: Changeme_123\nssl.crl: revoke.crl\nssl.sslCustomClass: org.apache.servicecomb.demo.DemoSSLCustom\n</code></pre>"},{"location":"spring-boot/diff-spring-mvc.html","title":"\u4e0eSpring Web MVC\u5f00\u53d1\u4e60\u60ef\u7684\u5dee\u5f02","text":"<p>Java Chassis\u652f\u6301\u4f7f\u7528Spring MVC\u63d0\u4f9b\u7684\u6807\u7b7e(org.springframework.web.bind.annotation)\u6765\u58f0\u660eREST\u63a5\u53e3\uff0c\u4f46\u662f\u4e24\u8005\u662f\u72ec\u7acb\u7684\u5b9e\u73b0\uff0c\u5e76\u4e14\u6709\u4e0d\u4e00\u6837\u7684\u8bbe\u8ba1\u76ee\u6807\u3002Java Chassis\u7684\u76ee\u6807\u662f\u63d0\u4f9b\u8de8\u8bed\u8a00\u3001\u652f\u6301\u591a\u901a\u4fe1\u534f\u8bae\u7684\u6846\u67b6\uff0c\u56e0\u6b64\u53bb\u6389\u4e86Spring Web MVC\u4e2d\u4e00\u4e9b\u5bf9\u8de8\u8bed\u8a00\u652f\u6301\u4e0d\u662f\u5f88\u597d\u7684\u7279\u6027\uff0c\u4e5f\u4e0d\u652f\u6301\u7279\u5b9a\u8fd0\u884c\u6846\u67b6\u5f3a\u76f8\u5173\u7684\u7279\u6027\uff0c\u6bd4\u5982\u76f4\u63a5\u8bbf\u95eeServlet\u534f\u8bae\u5b9a\u4e49\u7684HttpServletRequest\u3002Java Chassis\u652f\u6301\u7684Spring Web MVC\u6807\u7b7e\u662fSpring Boot\u7684\u5b50\u96c6\uff0c \u4e0b\u9762\u662f\u4e00\u4e9b\u663e\u8457\u7684\u5dee\u522b\u3002</p> <ul> <li>\u670d\u52a1\u58f0\u660e\u65b9\u5f0f</li> </ul> <p>Spring MVC\u4f7f\u7528@RestController\u58f0\u660e\u670d\u52a1\uff0c\u800cJava Chassis\u4f7f\u7528@RestSchema\u58f0\u660e\u670d\u52a1\uff0c\u5e76\u4e14\u9700\u8981\u663e\u793a\u7684\u4f7f\u7528@RequestMapping\u58f0\u660e\u670d\u52a1\u8def\u5f84\uff0c\u4ee5\u533a\u5206\u8be5\u670d\u52a1\u662f\u91c7\u7528Spring Web MVC\u7684\u6807\u7b7e\u8fd8\u662f\u4f7f\u7528JAX RS\u7684\u6807\u7b7e\u3002</p> <pre><code>@RestSchema(schemaId = \"hello\")\n@RequestMapping(path = \"/\")\n</code></pre> <p>Schema\u662fjava chassis\u7684\u670d\u52a1\u5951\u7ea6\uff0c\u662f\u670d\u52a1\u8fd0\u884c\u65f6\u7684\u57fa\u7840\uff0c\u670d\u52a1\u6cbb\u7406\u3001\u7f16\u89e3\u7801\u7b49\u90fd\u57fa\u4e8e\u5951\u7ea6\u8fdb\u884c\u3002\u5728\u8de8\u8bed\u8a00\u7684\u573a\u666f\uff0c\u5951\u7ea6\u4e5f\u5b9a\u4e49\u4e86\u4e0d\u540c\u8bed\u8a00\u80fd\u591f\u540c\u65f6\u7406\u89e3\u7684\u90e8\u5206\u3002</p> <ul> <li>\u6570\u636e\u7c7b\u578b\u652f\u6301</li> </ul> <p>\u91c7\u7528Spring Web MVC\uff0c\u53ef\u4ee5\u5728\u670d\u52a1\u5b9a\u4e49\u4e2d\u4f7f\u7528\u591a\u79cd\u6570\u636e\u7c7b\u578b\uff0c\u53ea\u8981\u8fd9\u79cd\u6570\u636e\u7c7b\u578b\u80fd\u591f\u88abJson\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u3002\u6bd4\u5982\uff1a</p> <pre><code>// \u62bd\u8c61\u7c7b\u578b\npublic void postData(@RequestBody Object data)\n// \u63a5\u53e3\u5b9a\u4e49\npublic void postData(@RequestBody IPerson interfaceData)\n// \u6ca1\u6307\u5b9a\u7c7b\u578b\u7684\u6cdb\u578b\npublic void postData(@RequestBody Map rawData)\n// \u5177\u4f53\u534f\u8bae\u76f8\u5173\u7684\u7c7b\u578b\npublic void postData(HttpServletRequest rquest)\n</code></pre> <p>Java Chassis\u4e0d\u652f\u6301\u4e0a\u8bc9\u7c7b\u578b\u3002\u56e0\u4e3aJava Chassis\u4f1a\u6839\u636e\u63a5\u53e3\u5b9a\u4e49\u751f\u6210\u5951\u7ea6\uff0c\u4ece\u4e0a\u9762\u7684\u63a5\u53e3\u5b9a\u4e49\uff0c\u5982\u679c\u4e0d\u7ed3\u5408\u5b9e\u9645\u7684\u5b9e\u73b0\u4ee3\u7801\u6216\u8005\u989d\u5916\u7684\u5f00\u53d1\u6587\u6863\u8bf4\u660e\uff0c\u65e0\u6cd5\u76f4\u63a5\u751f\u6210\u5951\u7ea6\u3002</p> <p>\u8bf4\u660e\uff1a \u4e3a\u4e86\u652f\u6301\u5feb\u901f\u5f00\u53d1\uff0cJava Chassis\u7684\u6570\u636e\u7c7b\u578b\u9650\u5236\u4e5f\u5728\u4e0d\u505c\u7684\u6269\u5145\uff0c\u6bd4\u5982\u652f\u6301HttpServletRequest\uff0c\u4f46\u662f\u5b9e\u9645\u5728\u4f7f\u7528\u7684\u65f6\u5019\uff0c\u4ed6\u4eec\u4e0eWEB\u670d\u52a1\u5668\u7684\u8bed\u4e49\u662f\u4e0d\u4e00\u6837\u7684\uff0c\u6bd4\u5982\u4e0d\u80fd\u76f4\u63a5\u64cd\u4f5c\u6d41\u3002\u56e0\u6b64\u5efa\u8bae\u5f00\u53d1\u8005\u5728\u7684\u4f7f\u7528\u573a\u666f\u4e0b\uff0c\u5c3d\u53ef\u80fd\u4f7f\u7528\u5951\u7ea6\u80fd\u591f\u63cf\u8ff0\u7684\u7c7b\u578b\uff0c\u8ba9\u4ee3\u7801\u9605\u8bfb\u6027\u66f4\u597d\u3002\u6b64\u5916\uff0cSpring\u9488\u5bf9DispatcherServlet\u505a\u4e86\u5927\u91cf\u7684\u6269\u5c55\uff0c\u8fd9\u4e9b\u6269\u5c55\u5bf9\u4e8eJava Chassis\u662f\u4e0d\u9002\u7528\u7684\u3002</p> <p>Java Chassis\u5728Spring Web MVC\u65b9\u9762\u7684\u66f4\u591a\u5f00\u53d1\u652f\u6301\uff0c\u53ef\u4ee5\u53c2\u8003\u7528SpringMVC \u5f00\u53d1\u5fae\u670d\u52a1\u3002</p>"},{"location":"spring-boot/introduction.html","title":"Java Chassis\u4e0eSpring Boot \u96c6\u6210\u4ecb\u7ecd","text":"<p>\u5c06 Spring Boot \u7528\u4e8e\u5fae\u670d\u52a1\u5f00\u53d1\uff0c\u53ef\u4ee5\u6781\u5927\u7684\u7b80\u5316\u5f00\u53d1\u8005\u914d\u7f6e\u548c\u90e8\u7f72\u3002Java Chassis\u5728Spring Boot\u57fa\u7840\u4e4b\u4e0a\uff0c\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u7684\u5fae\u670d\u52a1\u67b6\u6784\u6a21\u5f0f\u9700\u8981\u7684\u80fd\u529b\uff0c\u5305\u62ec\u670d\u52a1\u6ce8\u518c\u53d1\u73b0\u3001\u670d\u52a1\u6cbb\u7406\u3001\u826f\u597d\u7684\u8de8\u8bed\u8a00\u7279\u6027\u548c\u9ad8\u6548\u7684\u5f02\u6b65\u901a\u4fe1\u7b49\u80fd\u529b\u3002 </p> <p>Java Chassis\u6709\u4e24\u79cd\u65b9\u5f0f\u4f7f\u7528Spring Boot\uff1a</p> <ol> <li> <p>\u9ad8\u6027\u80fd\u6a21\u5f0f\uff1a\u4f7f\u7528Java Chassis\u9ad8\u6027\u80fdHTTP\u670d\u52a1\u5668\u3002</p> </li> <li> <p>Web\u5f00\u53d1\u65b9\u5f0f\uff1a\u4f7f\u7528Spring Boot\u81ea\u5e26\u7684Tomcat\u6216\u8005Jetty\u670d\u52a1\u5668\u3002</p> </li> </ol> <p></p> <ul> <li>\u9ad8\u6027\u80fd\u6a21\u5f0f</li> </ul> <p>\u5f15\u5165\u4f9d\u8d56</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-standalone&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>WebApplicationType\u6307\u5b9a\u4e3aNONE</p> <pre><code>@SpringBootApplication\npublic class ProviderApplication {\n public static void main(String[] args) {\n try {\n new SpringApplicationBuilder()\n .web(WebApplicationType.NONE)\n .sources(ProviderApplication.class)\n .run(args);\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}\n</code></pre> <ul> <li>Web\u6a21\u5f0f</li> </ul> <p>\u5f15\u5165\u4f9d\u8d56</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-servlet&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <p>WebApplicationType\u6307\u5b9a\u4e3aSERVLET</p> <pre><code>@SpringBootApplication\npublic class ProviderApplication {\n public static void main(String[] args) {\n try {\n new SpringApplicationBuilder()\n .web(WebApplicationType.SERVLET)\n .sources(ProviderApplication.class)\n .run(args);\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}\n</code></pre> <p>\u4e24\u79cd\u5f00\u53d1\u65b9\u5f0f\u90fd\u4f1a\u542f\u7528Java Chassis\u7684\u5168\u91cf\u529f\u80fd\uff0c\u9ad8\u6027\u80fd\u6a21\u5f0f\u8fd0\u884c\u4e8e\u72ec\u7acb\u7684HTTP\u670d\u52a1\u5668\uff08\u57fa\u4e8evert.x\u6784\u5efa\uff09\u4e0a\uff0c\u6027\u80fd\u4e0a\u5b58\u5728\u5f88\u5927\u7684\u4f18\u52bf\u3002Web\u6a21\u5f0f\u8fd0\u884c\u4e8eTomcat\u6216\u8005\u5176\u4ed6\u5185\u7f6e\u7684Web\u670d\u52a1\u5668\u4e4b\u4e0a\uff0c\u4f5c\u4e3a\u4e00\u4e2aServlet\u63a5\u6536\u8bf7\u6c42\uff0c\u56e0\u6b64\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528Web\u5bb9\u5668\u63d0\u4f9b\u7684\u4e00\u4e9b\u529f\u80fd\uff0c\u6bd4\u5982\u63d0\u4f9b\u9875\u9762\u670d\u52a1\uff0c\u4f7f\u7528Filter\u7b49\u3002</p> <p>\u5f53\u5e94\u7528\u53ea\u9700\u8981\u63d0\u4f9bREST\u670d\u52a1\uff0c\u5e76\u4e14\u5bf9\u6027\u80fd\u8981\u6c42\u9ad8\u7684\u573a\u666f\uff0c\u5efa\u8bae\u4f7f\u7528\u9ad8\u6027\u80fd\u6a21\u5f0f\u3002</p>"},{"location":"start/deployment-on-cloud.html","title":"Deployment on cloud","text":"<p>\u672c\u7ae0\u8282\u4e3b\u8981\u63cf\u8ff0\u5fae\u670d\u52a1\u53d1\u5e03\u5230\u534e\u4e3a\u516c\u6709\u4e91\u4e0a\u3002\u4e0a\u4e91\u914d\u7f6e\u7684\u57fa\u672c\u539f\u5219\u662f\uff1a\u53ea\u9700\u8981\u5bf9microservice.yaml\u8fdb\u884c\u9002\u5f53\u7684\u914d\u7f6e\uff0c\u4ee5\u53ca\u5728pom\u4e2d\u6dfb\u52a0\u989d\u5916\u7684\u4f9d\u8d56\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u76f8\u5173\u7684\u529f\u80fd\u3002</p>"},{"location":"start/deployment-on-cloud.html#_1","title":"\u4e00\u952e\u5f0f\u914d\u7f6e","text":"<p>\u516c\u6709\u4e91\u7248\u672c\u63d0\u4f9b\u4e86\u4e00\u952e\u5f0f\u7b80\u5316\u914d\u7f6e\u7684\u65b9\u5f0f\uff0c\u8ba9\u57fa\u4e8e\u5f00\u6e90\u7248\u672c\u5f00\u53d1\u7684\u5e94\u7528\u5feb\u901f\u5207\u6362\u4e3a\u4e91\u4e0a\u5e94\u7528\uff0c\u76f4\u63a5\u4f7f\u7528\u516c\u6709\u4e91\u63d0\u4f9b\u7684\u7070\u5ea6\u53d1\u5e03\u3001\u670d\u52a1\u6cbb\u7406\u7b49\u529f\u80fd\u3002</p> <ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb(pom.xml)</li> </ul> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt; \n &lt;artifactId&gt;cse-solution-service-engine&lt;/artifactId&gt; \n&lt;/dependency&gt;\n</code></pre> <p>\u5f00\u53d1\u8005\u53ea\u9700\u8981\u914d\u7f6e\u5bf9cse-solution-service-engine\u4f9d\u8d56\uff0c\u5c31\u5b8c\u6210\u4e86\u516c\u6709\u4e91\u7684\u6240\u6709\u914d\u7f6e\u3002\u8fd9\u4e2a\u4f9d\u8d56\u5173\u7cfb\u4e3b\u8981\u7ed9\u5f00\u53d1\u8005\u505a\u4e86\u5982\u4e0b\u4e8b\u60c5\uff1a</p> <ul> <li> <p>\u5f15\u5165\u76f8\u5173\u4f9d\u8d56\u7684\u7ec4\u4ef6</p> </li> <li> <p>\u589e\u52a0\u9ed8\u8ba4\u914d\u7f6e\u9879\u3002\u9ed8\u8ba4\u914d\u7f6e\u5305\u542b\u4e86\u5904\u7406\u94fe\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u7b49\u3002</p> </li> </ul> <p>\u53ef\u4ee5\u901a\u8fc7\u67e5\u770bpom\u5185\u5bb9\uff0c\u4ee5\u53ca\u8fd9\u4e2ajar\u5305\u91cc\u9762\u7684microservice.yaml\u6587\u4ef6\u67e5\u770b\u5f15\u5165\u7684\u7ec4\u4ef6\u548c\u589e\u52a0\u7684\u914d\u7f6e\u9879\u3002\u5728\u4e0b\u9762\u7684\u7ae0\u8282\u4e2d\uff0c\u8be6\u7ec6\u89e3\u91ca\u4e0a\u4e91\u589e\u52a0\u7684\u7ec4\u4ef6\u4ee5\u53ca\u4ed6\u4eec\u7684\u4f5c\u7528\uff0c\u8ba9\u5f00\u53d1\u8005\u66f4\u52a0\u6df1\u5165\u7684\u4e86\u89e3\u5404\u79cd\u6280\u672f\u7ec6\u8282\u3002</p>"},{"location":"start/deployment-on-cloud.html#_2","title":"\u8fde\u63a5\u670d\u52a1\u4e2d\u5fc3","text":""},{"location":"start/deployment-on-cloud.html#_3","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u670d\u52a1\u4e2d\u5fc3\u5b9e\u73b0\u6ce8\u518c\u548c\u53d1\u73b0\uff0c\u5728FusionStage/ServiceStage\u67e5\u770b\u5fae\u670d\u52a1\u76ee\u5f55\uff0c\u90fd\u9700\u8981\u5fae\u670d\u52a1\u8fde\u63a5\u4e0a\u670d\u52a1\u4e2d\u5fc3\u3002</p>"},{"location":"start/deployment-on-cloud.html#_4","title":"\u914d\u7f6e\u53c2\u8003","text":"<ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb(pom.xml)</li> </ul> <p>\u5982\u679c\u8fde\u63a5\u670d\u52a1\u4e2d\u5fc3\u4f7f\u7528https\u534f\u8bae/AK/SK\u8ba4\u8bc1\uff0c\u8be5jar\u4f9d\u8d56\u5fc5\u9009\u3002\u5982\u679c\u662fhttp\u534f\u8bae\uff0c\u5e76\u4e0d\u5305\u542btoken\u9a8c\u8bc1\uff0c\u5219\u65e0\u9700\u5f15\u5165\u3002</p> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt; \n &lt;artifactId&gt;foundation-auth&lt;/artifactId&gt; \n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u914d\u7f6e\u9879(microservice.yaml\uff09</li> </ul> <pre><code>servicecomb:\n service:\n registry:\n address: https://servicecomb.cn-north-1.myhwclouds.com:443 #\u6839\u636e\u5b9e\u9645\u5730\u5740\u914d\u7f6e\u670d\u52a1\u4e2d\u5fc3\u5730\u5740\n</code></pre> <p>\u8be5\u914d\u7f6e\u9879\u914d\u7f6e\u4e86\u670d\u52a1\u4e2d\u5fc3\u7684\u5730\u5740\u3002\u5176\u4e2d\uff0caddress\u53ef\u4ee5\u5728\u516c\u6709\u4e91\u201c\u5de5\u5177\u548c\u6848\u4f8b\u201d\u76ee\u5f55\u4e0b\u67e5\u5230\u5bf9\u5e94\u7684\u670d\u52a1\u4e2d\u5fc3\u5730\u5740\uff0c\u4fee\u6539\u534f\u8bae\uff08http/https\uff09\u3001\u4e3b\u673a\u540d\uff08\u53ef\u80fd\u4f7f\u7528\u57df\u540d\uff09\u548c\u7aef\u53e3\u53f7\u3002</p>"},{"location":"start/deployment-on-cloud.html#_5","title":"\u8fde\u63a5\u914d\u7f6e\u4e2d\u5fc3","text":""},{"location":"start/deployment-on-cloud.html#_6","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u914d\u7f6e\u4e2d\u5fc3\u5b9e\u73b0\u914d\u7f6e\u4e0b\u53d1\uff0c\u8fde\u63a5\u914d\u7f6e\u4e2d\u5fc3\u662f\u4f7f\u7528\u6cbb\u7406\u3001\u7070\u5ea6\u53d1\u5e03\u7b49\u529f\u80fd\u7684\u524d\u53f0\u3002</p>"},{"location":"start/deployment-on-cloud.html#_7","title":"\u914d\u7f6e\u53c2\u8003","text":"<ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb(pom.xml)</li> </ul> <p>\u5982\u679c\u8fde\u63a5\u914d\u7f6e\u4e2d\u5fc3\u4f7f\u7528https\u534f\u8bae/AK/SK\u8ba4\u8bc1\uff0c\u8be5jar\u4f9d\u8d56\u5fc5\u9009\u3002\u5982\u679c\u662fhttp\u534f\u8bae\uff0c\u5e76\u4e0d\u5305\u542btoken\u9a8c\u8bc1\uff0c\u5219\u65e0\u9700\u5f15\u5165\u3002</p> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt; \n &lt;artifactId&gt;foundation-auth&lt;/artifactId&gt; \n&lt;/dependency&gt;\n</code></pre> <p>\u8fde\u63a5\u914d\u7f6e\u4e2d\u5fc3\u8be5jar\u5fc5\u9009</p> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt; \n &lt;artifactId&gt;foundation-config-cc&lt;/artifactId&gt; \n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u542f\u7528\u914d\u7f6e(microservice.yaml\uff09</li> </ul> <pre><code>servicecomb:\n config:\n client:\n serverUri: https://servicecomb.cn-north-1.myhwclouds.com:443\n</code></pre> <p>\u8be5\u914d\u7f6e\u9879\u914d\u7f6e\u4e86\u914d\u7f6e\u4e2d\u5fc3\u7684\u5730\u5740\u3002\u5176\u4e2d\uff0caddress\u53ef\u4ee5\u5728\u516c\u6709\u4e91\u201c\u5de5\u5177\u548c\u6848\u4f8b\u201d\u76ee\u5f55\u4e0b\u67e5\u5230\u5bf9\u5e94\u7684\u914d\u7f6e\u4e2d\u5fc3\u5730\u5740\uff0c\u4fee\u6539\u534f\u8bae\uff08http/https\uff09\u3001\u4e3b\u673a\u540d\uff08\u53ef\u80fd\u4f7f\u7528\u57df\u540d\uff09\u548c\u7aef\u53e3\u53f7\u3002</p>"},{"location":"start/deployment-on-cloud.html#_8","title":"\u4f7f\u7528\u670d\u52a1\u6cbb\u7406","text":""},{"location":"start/deployment-on-cloud.html#_9","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u670d\u52a1\u6cbb\u7406\u4e3b\u8981\u6d89\u53ca\u201c\u9694\u79bb\u201d\u3001\u201c\u7194\u65ad\u201d\u3001\u201c\u5bb9\u9519\u201d\u3001\u201c\u9650\u6d41\u201d\u3001\u201c\u8d1f\u8f7d\u5747\u8861\u201d\u7b49\u3002</p>"},{"location":"start/deployment-on-cloud.html#_10","title":"\u914d\u7f6e\u53c2\u8003","text":"<p>\u914d\u7f6e\u9879(microservice.yaml\uff09</p> <p>\u9700\u8981\u589e\u52a0\u4e0b\u9762\u6cbb\u7406\u76f8\u5173\u7684handler\uff0c\u624d\u80fd\u5728\u4ece\u914d\u7f6e\u4e2d\u5fc3\u5b9e\u65f6\u83b7\u53d6\u6cbb\u7406\u6570\u636e\u3002</p> <pre><code>servicecomb:\n handler:\n chain:\n Provider:\n default: bizkeeper-provider,qps-flowcontrol-provider\n Consumer:\n default: bizkeeper-consumer,loadbalance,qps-flowcontrol-consumer\n</code></pre>"},{"location":"start/deployment-on-cloud.html#_11","title":"\u4f7f\u7528\u6545\u969c\u6ce8\u5165","text":""},{"location":"start/deployment-on-cloud.html#_12","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u6545\u969c\u6ce8\u5165\u4e3b\u8981\u63d0\u4f9b\u4e86\u5ef6\u65f6\u3001\u9519\u8bef\u4e24\u79cd\u7c7b\u578b\u6545\u969c\u3002</p>"},{"location":"start/deployment-on-cloud.html#_13","title":"\u914d\u7f6e\u53c2\u8003","text":"<p>\u914d\u7f6e\u9879(microservice.yaml\uff09</p> <p>\u9700\u8981\u589e\u52a0\u4e0b\u9762\u6cbb\u7406\u76f8\u5173\u7684handler\u3002</p> <pre><code>servicecomb:\n handler:\n chain:\n Consumer:\n default: loadbalance,fault-injection-consumer\n</code></pre>"},{"location":"start/deployment-on-cloud.html#_14","title":"\u4f7f\u7528\u7070\u5ea6\u53d1\u5e03","text":""},{"location":"start/deployment-on-cloud.html#_15","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u8be5\u529f\u80fd\u5bf9\u5e94\u4e8e\u5fae\u670d\u52a1\u76ee\u5f55\u7070\u5ea6\u53d1\u5e03\u529f\u80fd\u3002\u7ba1\u7406\u5458\u53ef\u4ee5\u901a\u8fc7\u4e0b\u53d1\u89c4\u5219\uff0c\u5bf9\u670d\u52a1\u8fdb\u884c\u7070\u5ea6\u53d1\u5e03\u7ba1\u7406\u3002</p>"},{"location":"start/deployment-on-cloud.html#_16","title":"\u914d\u7f6e\u53c2\u8003","text":"<ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb(pom.xml)</li> </ul> <p>\u5f15\u5165\u5fc5\u8981\u7684jar\u5305\u3002</p> <pre><code>&lt;dependency&gt; \n &lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt; \n &lt;artifactId&gt;cse-handler-cloud-extension&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u5728Consumer\u7aef\u914d\u7f6e\u8d1f\u8f7d\u5747\u8861(microservice.yaml\uff09</li> </ul> <p>\u5728\u8d1f\u8f7d\u5747\u8861\u6a21\u5757\u542f\u7528\u4e86\u7070\u5ea6\u53d1\u5e03\u7684filter\u3002</p> <pre><code>servicecomb:\n loadbalance:\n serverListFilters: darklaunch\n serverListFilter:\n darklaunch:\n className: com.huawei.paas.darklaunch.DarklaunchServerListFilter\n</code></pre>"},{"location":"start/deployment-on-cloud.html#_17","title":"\u4f7f\u7528\u8c03\u7528\u94fe","text":""},{"location":"start/deployment-on-cloud.html#_18","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u534e\u4e3a\u4e91\u63d0\u4f9b\u4e86\u4e1a\u52a1\u65e0\u4fb5\u5165\u7684\u57cb\u70b9\u529f\u80fdAPM\u3002\u53ea\u9700\u8981\u901a\u8fc7\u534e\u4e3a\u4e91\u90e8\u7f72\u5bb9\u5668\u5e94\u7528\uff0c\u5e76\u9009\u62e9\u542f\u7528\u8c03\u7528\u94fe\u76d1\u63a7\u529f\u80fd\uff0c\u5373\u53ef\u4f7f\u7528\u8c03\u7528\u94fe\u670d\u52a1\u3002</p>"},{"location":"start/deployment-on-cloud.html#_19","title":"\u5fae\u670d\u52a1\u8fd0\u884c\u6570\u636e\u4e0a\u62a5","text":""},{"location":"start/deployment-on-cloud.html#_20","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u5fae\u670d\u52a1\u53ef\u4ee5\u5c06\u81ea\u5df1\u7684\u8fd0\u884c\u6570\u636e\u4e0a\u62a5\u7ed9Dashboard\u670d\u52a1\uff0c\u5728\u516c\u6709\u4e91\u4e0a\u67e5\u770b\u4eea\u8868\u76d8\u6570\u636e\u3001\u5206\u5e03\u5f0f\u4e8b\u52a1\u6570\u636e\u7b49\u3002\u8be5\u7ae0\u8282\u662f\u63cf\u8ff0\u5982\u4f55\u542f\u7528\u5fae\u670d\u52a1\u6570\u636e\u4e0a\u62a5\u529f\u80fd\u3002</p>"},{"location":"start/deployment-on-cloud.html#_21","title":"\u914d\u7f6e\u53c2\u8003","text":"<ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb(pom.xml)</li> </ul> <p>\u5f15\u5165\u5fc5\u8981\u7684jar\u5305\u3002</p> <pre><code>&lt;dependency&gt;\n\u3000\u3000&lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt;\n\u3000\u3000&lt;artifactId&gt;cse-handler-cloud-extension&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u914d\u7f6ehandler</li> </ul> <p>\u4eea\u8868\u76d8\u6570\u636e\u4f9d\u8d56\u4e8e\u4e24\u4e2ahandler\uff0c\u4e00\u4e2abizkeeper-provider\uff08\u5ba2\u6237\u7aef\u4e3abizkeeper-consumer\uff09\uff0c\u4e00\u4e2aperf-stats\uff0c\u6240\u4ee5\u5bf9\u5e94\u7684pom\u4f9d\u8d56\u9700\u8981\u5148\u5f15\u5165\u3002</p> <pre><code>servicecomb: \n handler:\n chain:\n Provider:\n default: bizkeeper-provider,perf-stats,tracing-provider,sla-provider\n Consumer:\n default: bizkeeper-consumer,loadbalance,perf-stats,tracing-consumer,sla-consumer\n</code></pre> <ul> <li>\u914d\u7f6e\u4e0a\u62a5monitor\u5730\u5740</li> </ul> <p>TenantLB_ADDRESS\u4e3a\u5171\u6709\u4e91\u79df\u6237\u7ba1\u7406\u9762\u63a5\u5165\u5730\u5740\uff0c\u9ed8\u8ba4\u662f100.125.1.34\u3002</p> <pre><code>servicecomb:\n service:\n registry:\n address: https://${TenantLB_ADDRESS}:30100\n monitor:\n client:\n serverUri: https://${TenantLB_ADDRESS}:30109\n</code></pre>"},{"location":"start/deployment-on-cloud.html#tcc","title":"\u5206\u5e03\u5f0f\u4e8b\u52a1: TCC","text":""},{"location":"start/deployment-on-cloud.html#_22","title":"\u529f\u80fd\u63cf\u8ff0","text":"<p>\u4e3b\u8981\u5b9e\u73b0\u57fa\u4e8eTCC\u534f\u8bae\u7684\u5206\u5e03\u5f0f\u670d\u52a1\u95f4\u7684\u6700\u7ec8\u4e00\u81f4\u6027\u65b9\u6848\uff0c\u4fdd\u969c\u4e00\u822c\u573a\u666f\u4e0b\u7684\u5e94\u7528\u4e00\u81f4\u6027\u9700\u6c42\uff0c\u5e76\u53ef\u4ee5\u5728FusionStage/ServiceStage\u5206\u5e03\u5f0f\u4e8b\u52a1\u754c\u9762\u67e5\u770b\u4e8b\u52a1\u8be6\u7ec6\u4fe1\u606f\u3002</p>"},{"location":"start/deployment-on-cloud.html#_23","title":"\u914d\u7f6e\u53c2\u8003","text":"<ul> <li>\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb(pom.xml)</li> </ul> <p>\u5f15\u5165\u5fc5\u8981\u7684jar\u5305</p> <pre><code>&lt;dependency&gt;\n\u3000\u3000&lt;groupId&gt;com.huawei.paas.cse&lt;/groupId&gt;\n\u3000\u3000&lt;artifactId&gt;cse-handler-tcc&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre> <ul> <li>\u914d\u7f6e\u9879\u53c2\u8003</li> </ul> <p>\u9700\u8981\u589e\u52a0\u4e0b\u9762\u4e8b\u52a1\u76f8\u5173\u7684handler\uff0c\u624d\u80fd\u5728\u4ece\u914d\u7f6e\u4e2d\u5fc3\u5b9e\u65f6\u83b7\u53d6\u6cbb\u7406\u6570\u636e\u3002</p> <pre><code>servicecomb:\n handler:\n chain:\n Provider:\n default: tcc-client,bizkeeper-provider\n Consumer:\n default: tcc-server,bizkeeper-consumer,loadbalance\n</code></pre>"},{"location":"start/design.html","title":"Java Chassis \u8bbe\u8ba1\u53c2\u8003","text":"<p>Java Chassis \u7ed3\u5408\u5927\u91cf\u5fae\u670d\u52a1\u5f00\u53d1\u5b9e\u8df5\uff0c\u5b9e\u73b0\u5fae\u670d\u52a1\u67b6\u6784\u6a21\u5f0f \uff0c \u5e2e \u52a9\u5f00\u53d1\u8005\u66f4\u52a0\u7b80\u5355\u3001\u5feb\u901f\u7684\u6784\u5efa\u5fae\u670d\u52a1\u5e94\u7528\u3002</p> <p>Java Chassis\u4e3b\u8981\u5b9e\u73b0\u4e86\u5982\u4e0b\u5fae\u670d\u52a1\u67b6\u6784\u6a21\u5f0f\u529f\u80fd\uff1a</p> <ul> <li>\u5fae\u670d\u52a1\u4e4b\u95f4\u7684 RPC \u901a\u4fe1\u3002Java Chassis \u63d0\u4f9b\u4e86\u975e\u5e38\u9ad8\u6548\u7684\u901a\u4fe1\u65b9\u5f0f\uff0c\u5e76\u652f\u6301\u591a\u534f\u8bae\u6269\u5c55\uff0c\u6bd4\u5982\u6700\u5feb\u7684 REST \u901a\u4fe1\u6a21\u5f0f\u5b9e\u73b0\uff0c \u5f02\u6b65\u7684\u4e8c\u8fdb\u5236\u901a\u4fe1\u6a21\u5f0f HIGHWAY \u3002 </li> <li>\u5206\u5e03\u5f0f\u5fae\u670d\u52a1\u6ce8\u518c\u548c\u670d\u52a1\u53d1\u73b0\u80fd\u529b\u3002Java Chassis\u652f\u6301\u4f7f\u7528\u4e0d\u540c\u7684\u6ce8\u518c\u4e2d\u5fc3\uff0c\u5b9e\u73b0\u5206\u5e03\u5f0f\u3001\u591a\u96c6\u7fa4\u670d\u52a1\u53d1\u73b0\u80fd\u529b\uff0c\u4ee5\u53ca\u5fae\u670d\u52a1\u5143\u6570\u636e\u7ba1\u7406\u80fd\u529b\u3002</li> <li>\u5206\u5e03\u5f0f\u5fae\u670d\u52a1\u914d\u7f6e\u7ba1\u7406\u80fd\u529b\u3002Java Chassis\u652f\u6301\u4f7f\u7528\u4e0d\u540c\u7684\u914d\u7f6e\u4e2d\u5fc3\uff0c\u5b9e\u73b0\u52a8\u6001\u3001\u96c6\u4e2d\u7684\u914d\u7f6e\u7ba1\u7406\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u4f7f\u7528Spring Boot\u539f\u751fAPI\u8bbf\u95ee\u914d\u7f6e\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528Java Chassis\u65b0\u589eAPI\uff0c \u6ee1\u8db3\u914d\u7f6e\u53d8\u66f4\u76d1\u542c\u3001\u4f18\u5148\u7ea7\u914d\u7f6e\u7b49\u9ad8\u9636\u5f00\u53d1\u80fd\u529b\u3002 </li> <li>\u5206\u5e03\u5f0f\u6545\u969c\u7ba1\u7406\uff0c\u670d\u52a1\u5bb9\u9519\u3001\u9694\u79bb\u3001\u7194\u65ad\u3002 \u5185\u7f6e\u6545\u969c\u5b9e\u4f8b\u9694\u79bb\u3001\u6545\u969c\u91cd\u8bd5\u3001\u6d41\u91cf\u63a7\u5236\u7b49\u8fc7\u8f7d\u9632\u62a4\u548c\u6545\u969c\u5904\u7406\u80fd\u529b\u3002</li> <li>\u5206\u5e03\u5f0f\u65e5\u5fd7\u8ffd\u8e2a\u3002 \u63d0\u4f9b Open Tracing \u652f\u6301\u3002 </li> </ul> <p>\u6b64\u5916\u8fd8\u6709\u6027\u80fd\u76d1\u63a7\u3001\u65e5\u5fd7\u7ba1\u7406\u3001\u5065\u5eb7\u68c0\u67e5\u7b49\u529f\u80fd\u3002 Java Chassis \u91c7\u7528\u4f18\u96c5\u7684\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u5b9e\u73b0\u4e86\u4e0a\u8ff0\u6240\u6709\u7684\u6838\u5fc3\u90e8\u4ef6\u7684\u529f\u80fd\uff0c\u5e76\u4e14\u4f7f\u5f97\u8fd9\u4e9b\u529f\u80fd\u5f00\u7bb1\u5373\u7528\u3002\u4f7f\u7528 Java Chassis , \u5f00\u53d1\u8005\u80fd\u591f\u66f4\u52a0\u805a\u7126\u4e8e\u4e1a\u52a1\u529f\u80fd\u5f00\u53d1\uff0c\u5feb\u901f\u7684\u6784\u5efa\u5546\u4e1a\u53ef\u7528\u7684\u5fae\u670d\u52a1\u5e94\u7528\u3002 </p>"},{"location":"start/design.html#java-chassis_1","title":"Java Chassis \u8f6f\u4ef6\u5de5\u7a0b\u5b9e\u8df5","text":"<p>Java Chassis \u5728\u8bbe\u8ba1\u7684\u65f6\u5019\uff0c \u4e0d\u4ec5\u8003\u8651\u4e86\u5982\u4f55\u66f4\u597d\u7684\u4f7f\u7528\u5fae\u670d\u52a1\u67b6\u6784\u6a21\u5f0f\uff0c \u8fd8\u628a\u4f18\u79c0\u7684\u8f6f\u4ef6\u5de5\u7a0b\u601d\u60f3\u878d\u5408\u8fdb\u6765\uff0c \u5e2e\u52a9\u5f00\u53d1\u8005\u66f4\u597d\u7684\u7ba1\u7406\u4fe1\u606f \u8d44\u4ea7\uff0c \u63d0\u5347\u8f6f\u4ef6\u5de5\u7a0b\u7ba1\u7406\u80fd\u529b\u3002 </p> <p>\u4e0b\u56fe\u7b80\u5355\u7684\u63cf\u8ff0 \u201c\u4ee5\u5951\u7ea6\u4e3a\u4e2d\u5fc3\u201d \u7684\u6838\u5fc3\u6982\u5ff5\u3002 </p> <p> </p> <p>\u53ef\u4ee5\u901a\u8fc7 Invocation \u83b7\u53d6\u5230 Java Chassis \u7684\u5951\u7ea6\u7b49\u6e90\u6570\u636e\u4fe1\u606f\uff0c \u662f Java Chassis \u7684\u4e00\u4e2a\u6838\u5fc3\u5bf9\u8c61\u3002 </p> <p>\u53ef\u4ee5\u9605\u8bfb \u57fa\u4e8eCSE\u7684\u5fae\u670d\u52a1\u5de5\u7a0b\u5b9e\u8df5-\u4ee5\u5951\u7ea6\u4e3a\u4e2d\u5fc3 \u4e86\u89e3\u5951\u7ea6\u5982\u4f55\u5e94\u7528\u7684\u66f4\u591a\u5185\u5bb9\u3002 \u5de5\u7a0b \u5b9e\u8df5\u4e0d\u662f Java Chassis \u7684\u5f3a\u5236\u7ea6\u675f\uff0c \u5f00\u53d1\u8005\u53ef\u4ee5\u7ed3\u5408\u5b9e\u9645\u60c5\u51b5\u8fdb\u884c\u9009\u62e9\u3002 </p>"},{"location":"start/design.html#java-chassis_2","title":"Java Chassis \u8fd0\u884c\u65f6\u67b6\u6784","text":"<p>\u4e3a\u4e86\u652f\u6301\u8f6f\u4ef6\u5de5\u7a0b\u5b9e\u8df5\uff0c Java Chassis \u7684\u8fd0\u884c\u65f6\u67b6\u6784\u662f\u4e00\u4e2a\u54d1\u94c3\u7ed3\u6784\uff0c \u4e24\u7aef\u5206\u522b\u662f\u201c\u7f16\u7a0b\u6a21\u578b\u201d \u548c \u201c\u901a\u4fe1\u6a21\u578b\u201d\uff0c \u4e2d\u95f4\u662f\u201c\u8fd0\u884c\u6a21\u578b\u201d\u3002 </p> <p></p> <p>\u201c\u7f16\u7a0b\u6a21\u578b\u201d \u9762\u5411\u5f00\u53d1\u8005\u5199\u670d\u52a1\u63a5\u53e3\u7684\u4e60\u60ef\uff0c \u201c\u901a\u4fe1\u6a21\u578b\u201d \u9762\u5411\u5fae\u670d\u52a1\u4e4b\u95f4\u7684\u9ad8\u6548\u7f16\u7801\u548c\u901a\u4fe1\uff0c \u201c\u8fd0\u884c\u6a21\u578b\u201d \u57fa\u4e8e\u201c\u5951\u7ea6\u201d\uff0c \u63d0\u4f9b\u4e00\u79cd\u670d\u52a1\u65e0\u5173 \u7684\u63d2\u62d4\u673a\u5236\uff0c\u80fd\u591f\u8ba9\u5f00\u53d1\u8005\u72ec\u7acb\u4e8e\u4e1a\u52a1\u5b9e\u73b0\u5f00\u53d1\u6cbb\u7406\u529f\u80fd\uff0c\u5e76\u4e14\u7075\u6d3b\u7684\u79fb\u9664\u548c\u589e\u52a0\u529f\u80fd\uff0c\u4ee5\u53ca\u8c03\u6574\u8fd9\u4e9b\u6cbb\u7406\u529f\u80fd\u7684\u5904\u7406\u987a\u5e8f\u3002 </p> <p>\u201c\u8fd0\u884c\u6a21\u578b\u201d \u7684\u6838\u5fc3\u62bd\u8c61\u63a5\u53e3\u662f Filter \uff0c \u8fd9\u4e2a\u63a5\u53e3\u662f\u4e00\u4e2a\u5f02\u6b65\u7684\u5b9a\u4e49\uff0c Java Chassis \u8fd0\u884c\u65f6\u6a21\u578b\u91c7\u7528\u7eaf\u5f02\u6b65\u7684\u5b9e\u73b0\uff0c \u8ba9\u6574\u4e2a\u7cfb\u7edf\u8fd0\u884c\u975e\u5e38 \u9ad8\u6548\u3002 </p> <p>\u53ef\u4ee5\u9605\u8bfb Apache ServiceComb \u7684\u5f00\u653e\u6027\u8bbe\u8ba1 \u4e86\u89e3 Java Chassis \u8fd0\u884c\u65f6\u67b6\u6784\u7684\u5176\u4ed6\u8bbe\u8ba1\u8003\u8651\u3002 </p>"},{"location":"start/design.html#java-chassis_3","title":"Java Chassis \u5fae\u670d\u52a1\u5e94\u7528\u67b6\u6784","text":"<p>\u6709\u5f88\u591a\u4f18\u79c0\u7684\u5fae\u670d\u52a1\u5e94\u7528\u67b6\u6784\u5b9e\u8df5\u3002 \u5fae\u670d\u52a1\u5e94\u7528\u67b6\u6784\u5e94\u8be5\u5145\u5206\u8003\u8651\u7cfb\u7edf\u7684\u5f39\u6027\uff0c \u80fd\u591f\u9488\u5bf9\u7cfb\u7edf\u7684\u6027\u80fd\u74f6\u9888\u70b9\u8fdb\u884c\u6269\u5bb9\uff0c \u9700\u8981\u8003\u8651\u5e94\u7528\u7cfb\u7edf\u5185\u90e8\u5fae\u670d\u52a1 \u62c6\u5206\u7684\u7075\u6d3b\u6027\uff0c \u4e3a\u4e1a\u52a1\u7684\u53d8\u66f4\u505a\u597d\u53ca\u65f6\u8c03\u6574\u3002 </p> <p>\u4e0b\u56fe\u5c55\u793a\u4e86\u4e00\u4e2a\u5178\u578b\u7684\u5e94\u7528\u67b6\u6784\u3002 \u63a5\u5165\u5c42\u91c7\u7528\u4e00\u4e9b\u7f51\u7edc\u57fa\u7840\u8bbe\u65bd\uff0c\u6bd4\u5982 DNS \uff0c \u6d6e\u52a8 IP \u7b49\u65b9\u4fbf\u7528\u6237\u91c7\u7528\u7edf\u4e00\u7684 URL \u8bbf\u95ee\u7cfb\u7edf\uff0c \u6216\u8005\u91c7\u7528 API \u7f51\u5173\u7b49 \u57fa\u7840\u8bbe\u65bd\u5b9e\u73b0\u7cfb\u7edf\u7684\u80fd\u529b\u5f00\u653e\u3002 \u4e1a\u52a1\u5c42\u5305\u542b\u5e94\u7528\u7f51\u5173\uff0c \u8fdb\u884c\u4e00\u4e9b\u8ba4\u8bc1\u9274\u6743\u3001 \u5ba1\u8ba1\u7b49\u529f\u80fd\uff0c \u7ecf\u8fc7\u8ba4\u8bc1\u7684\u8bf7\u6c42\u88ab\u5e94\u7528\u7f51\u5173\u8f6c\u53d1\u5230\u5fae\u670d\u52a1\u7cfb\u7edf\u5185\u90e8\u3002 </p> <p></p> <p>\u53ef\u4ee5\u9605\u8bfb\u5355\u4f53\u5e94\u7528\u5fae\u670d\u52a1\u6539\u9020\u5b9e\u8df5 \uff0c \u4e86\u89e3\u4e3a\u4ec0\u4e48\u63a8\u8350\u8fd9\u6837\u7684\u5fae\u670d\u52a1\u5e94\u7528\u67b6\u6784\u3002 Java Chassis \u4e3a\u5e94\u7528\u67b6\u6784\u63d0\u4f9b\u4e86\u63a5\u5165\u7f51\u5173\u670d\u52a1 Edge Servcie\u3002 </p>"},{"location":"start/design.html#java-chassis_4","title":"Java Chassis \u5fae\u670d\u52a1\u6280\u672f\u9009\u578b","text":"<p>Java \u8bed\u8a00\u62e5\u6709\u5e9e\u5927\u7684\u6280\u672f\u4f53\u7cfb\u548c\u6807\u51c6\uff0c \u5e76\u4e14\u5e7f\u6cdb\u7684\u5e94\u7528\u5230\u4e1a\u52a1\u7684\u7cfb\u7edf\u7684\u5404\u4e2a\u65b9\u9762\u3002 \u548c Java Chassis \u6709\u7d27\u5bc6\u5173\u7cfb\u7684\u6280\u672f\u5305\u62ec JSP/Servlet \u6807\u51c6 \u548c\u5bb9\u5668\uff0c Spring \u548c Spring Boot \u6280\u672f\uff0c \u4ee5\u53ca Spring Boot \u63d0\u4f9b\u7684 REST \u5f00\u53d1\u6846\u67b6 Spring MVC\u3002 </p>"},{"location":"start/design.html#java-chassis-servlet","title":"Java Chassis \u548c Servlet \u6807\u51c6","text":"<p>Java Chassis \u57fa\u4e8e Vert.x \u5b9e\u73b0\u4e86 REST \u548c HIGHWAY \u7b49 RPC \u534f\u8bae\u7684\u5b9e\u73b0\uff0c \u5728\u6027\u80fd\u8981\u6c42\u9ad8\u7684\u6838\u5fc3\u4e1a\u52a1\u573a\u666f\uff0c \u4f7f\u7528\u8fd9\u79cd\u8f7b\u91cf\u7ea7\u7684\u6280\u672f\u975e\u5e38\u5408\u9002\u3002 \u8fd9\u79cd\u573a\u666f\u4e0b\uff0c \u6ca1\u6709\u5b8c\u6574\u7684\u5b9e\u73b0 JSP/Servlet \u76f8\u5173\u63a5\u53e3\uff0c \u6bd4\u5982 HttpServletRequest, HttpServletResponse \u7b49\u3002 servicecomb-samples \u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b8c\u6574\u7684\u4f7f\u7528\u8fd9\u79cd\u90e8\u7f72\u6a21\u5f0f\u7684\u4f8b\u5b50\u3002 \u57fa\u4e8eCSE\u7684\u5fae\u670d\u52a1\u67b6\u6784\u5b9e\u8df5-\u8f7b\u91cf\u7ea7\u67b6\u6784\u6280\u672f\u9009\u578b \u63d0\u4f9b\u4e86 \u4e00\u4e9b\u5e38\u89c1\u7684\u7ec4\u4ef6\u7684\u9009\u578b\u53c2\u8003\u3002 </p> <p>Java Chassis \u652f\u6301 Servlet \u6807\u51c6\u7684\u5bb9\u5668\u3002 \u5728\u8fd9\u4e2a\u573a\u666f\u4e0b\uff0c Java Chassis \u7684\u6838\u5fc3\u90e8\u4ef6\u5c31\u662f\u4e00\u4e2a Servlet \uff0c \u5728\u8fd9\u4e2a Servlet \u91cc\u9762 \u5b9e\u73b0\u4e86 Java Chassis \u7684\u6838\u5fc3 RPC \u7cfb\u7edf\u3002 \u91c7\u7528 JSP/Servlet \u5bb9\u5668\u8fd0\u884c Java Chassis, \u4e1a\u52a1\u8bf7\u6c42\u9996\u5148\u7ecf\u8fc7\u5bb9\u5668\u7684 HTTP \u5b9e\u73b0\uff0c \u7136\u540e\u7ecf\u8fc7 Filter\uff0c \u8fdb\u5165 Java Chassis \u7684 RestServlet \uff0c \u8fd0\u884c Java Chassis \u7684\u8fd0\u884c\u65f6\u6a21\u578b\uff0c \u8fdb\u5165\u4e1a\u52a1\u63a5\u53e3\u5904\u7406\u3002 \u53ef\u4ee5\u53c2\u8003 REST over Servlet \u4e86\u89e3\u5982\u4f55\u5728 Servlet \u5bb9\u5668\u4e2d\u52a0\u8f7d Java Chassis \u7684 Servlet\u3002 </p>"},{"location":"start/design.html#java-chassis-spring-boot","title":"Java Chassis \u548c Spring Boot","text":"<p>Java Chassis \u5efa\u7acb\u5728 Spring Boot\u6280\u672f\u4e4b\u4e0a\uff0c\u6838\u5fc3\u90e8\u4ef6\u90fd\u901a\u8fc7Spring Boot\u6280\u672f\u63d0\u4f9b\u5b9e\u73b0\u548c\u6269\u5c55\u3002 </p> <p>Spring Boot \u63d0\u4f9b\u4e86\u591a\u79cd\u8fd0\u884c\u73af\u5883\u652f\u6301\uff0c WebApplicationType.NONE, WebApplicationType.SERVLET, WebApplicationType.REACTIVE\uff0c Java Chassis \u53ef\u4ee5\u96c6\u6210 NONE, SERVLET \u4e24\u79cd\u6a21\u5f0f\u3002 \u5728 NONE \u6a21\u5f0f\u4e0b\u96c6\u6210 Java Chassis\uff0c \u548c Spring Boot \u81ea\u8eab\u7684 REACTIVE \u975e\u5e38\u7c7b\u4f3c\uff0c \u4f46\u662f\u6bd4 Spring Boot \u7684 REACTIVE \u8fd0\u884c\u66f4\u52a0\u9ad8\u6548\uff0c \u5e76\u4e14\u652f\u6301\u65e9\u671f\u7684 RestTemplate API \u548c RPC API \u6765\u8bbf\u95ee\u670d\u52a1\u3002 </p> <p>\u53ef\u4ee5\u9605\u8bfb\u57fa\u4e8eCSE\u7684\u5fae\u670d\u52a1\u67b6\u6784\u5b9e\u8df5-Spring Boot\u6280\u672f\u6808\u9009\u578b \u4e86\u89e3\u4e00\u4e9b\u5e38\u7528\u7684 Spring Boot \u5f00\u53d1\u7684\u7ec4\u4ef6\u9009\u578b\u53c2\u8003\u3002 servicecomb-samples \u63d0\u4f9b \u4e86 WebApplicationType.SERVLET \u4f7f\u7528 Spring Boot \u7684\u5b8c\u6574\u4f8b\u5b50\u3002 WebApplicationType.NONE \u6a21\u5f0f\u7b49\u4ef7\u4e8e\u8f7b\u91cf\u7ea7\u6a21\u5f0f\uff0c \u4f46\u662f\u53ef\u4ee5\u4f7f\u7528 Spring Boot \u7684\u6253\u5305\u529f\u80fd\u4ee5\u53ca\u5176\u4ed6\u5f00\u53d1\u7ec4\u4ef6\u652f\u6301\u3002 </p> <ul> <li>Spring MVC </li> </ul> <p>Java Chassis \u7ee7\u627f\u4e86 Spring MVC \u7684\u63a5\u53e3\u8bbe\u8ba1\uff0c \u63d0\u4f9b\u4e86 Provider \u548c Consumer \u5c42\u9762\u7684 API \u63a5\u53e3\u6765\u5b9a\u4e49 REST \u63a5\u53e3\u548c\u8bbf\u95ee REST \u63a5\u53e3\u3002 \u4f46\u662f\u9700\u8981 \u6ce8\u610f\u7684\u662f\uff0c \u4e24\u4e2a\u662f\u5b8c\u5168\u4e0d\u540c\u7684\u5b9e\u73b0\uff0c \u5b9e\u73b0\u673a\u5236\u4e5f\u4e0d\u4e00\u6837\u3002 Spring Boot \u4e3b\u8981\u57fa\u4e8e Servlet\uff0c \u5b9e\u73b0\u4e86 MVC \u6a21\u5f0f\uff0c \u4e0d\u4ec5\u53ef\u4ee5\u5f00\u53d1 REST \u63a5\u53e3\uff0c \u8fd8\u53ef\u4ee5 \u5f00\u53d1\u5176\u4ed6 HTTP \u529f\u80fd\uff0c \u6bd4\u5982\u91cd\u5b9a\u5411\uff0c \u8fd4\u56de HTML \u9875\u9762\u7b49\uff0c \u8fd8\u53ef\u4ee5\u901a\u8fc7 @ExceptionHandler\uff0c @ControllerAdvice \u7b49\u673a\u5236\u62e6\u622a Servlet \u8bf7\u6c42\uff0c\u8fdb\u884c \u5f02\u5e38\u5904\u7406\u3002 Java Chassis \u53ea\u5b9e\u73b0\u4e86 REST \u670d\u52a1\u5b9a\u4e49\u548c\u8c03\u7528\uff0c \u5e76\u4e14\u5728\u5f02\u5e38\u5904\u7406\u673a\u5236\u548c\u8bf7\u6c42\u62e6\u622a\u673a\u5236\u4e0a\u4e0d\u4e00\u6837\u3002 \u5f00\u53d1\u7ec6\u8282\u4e0a\u7684\u5dee\u5f02\u53ef\u4ee5\u901a\u8fc7 \u7528SpringMVC \u5f00\u53d1\u5fae\u670d\u52a1 \u8fdb\u884c\u4e86\u89e3\u3002 </p>"},{"location":"start/design.html#java-chassis-spring-cloud","title":"Java Chassis \u4e0e Spring Cloud","text":"<p>Java Chassis \u548c Spring Cloud \u90fd\u5b9e\u73b0\u4e86\u5fae\u670d\u52a1\u67b6\u6784\u6a21\u5f0f\uff0c \u76f8\u6bd4\u800c\u8a00\uff0c Java Chassis \u662f\u4e00\u4e2a\u66f4\u52a0\u7d27\u51d1\u7684\u5b9e\u73b0\uff0c \u5f00\u7bb1\u5373\u7528\uff0c \u800c Spring Cloud \u5219\u662f \u76f8\u5bf9\u677e\u6563\u7684\u5b9e\u73b0\uff0c \u901a\u5e38\u9700\u8981\u7ed3\u5408\u5f88\u591a\u7b2c\u4e09\u65b9\u7684\u7ec4\u4ef6\u624d\u80fd\u591f\u5b8c\u6210\u7aef\u5230\u7aef\u7684\u5fae\u670d\u52a1\u5f00\u53d1\u3002 </p> <p>\u5fae\u670d\u52a1\u67b6\u6784\u6a21\u5f0f\u5173\u6ce8\u5fae\u670d\u52a1\u5185\u90e8\u548c\u5fae\u670d\u52a1\u4e4b\u95f4\u7684\u8bbe\u8ba1\uff0c \u4e5f\u5173\u6ce8\u5fae\u670d\u52a1\u4e0e\u5fae\u670d\u52a1\u57fa\u7840\u8bbe\u65bd\u4e4b\u95f4\u7684\u5173\u7cfb\u3002 Java Chassis \u5fae\u670d\u52a1\u57fa\u7840\u8bbe\u65bd\u5305\u62ec\u670d\u52a1\u6ce8\u518c\u548c\u53d1\u73b0\uff0c \u670d\u52a1\u914d\u7f6e\u7ba1\u7406\uff0c \u7070\u5ea6\u53d1\u5e03\u548c\u5951\u7ea6\u7ba1\u7406\u7b49\u529f\u80fd\u3002 Spring Cloud \u53ef\u4ee5\u4f7f\u7528 spring-cloud-huawei \u6765\u4f7f\u7528 Java Chassis \u76f8\u5173\u7684\u5fae\u670d\u52a1\u57fa\u7840\u8bbe\u65bd\u3002 </p> <p></p> <p>\u53ef\u4ee5\u9605\u8bfb\u57fa\u4e8eCSE\u7684\u5fae\u670d\u52a1\u67b6\u6784\u5b9e\u8df5-Spring Cloud\u6280\u672f\u6808\u9009\u578b \u4e86\u89e3 Java Chassis \u548c Spring Cloud \u7ec4\u4ef6\u9009\u578b\u4e0a\u7684\u4e00\u4e9b\u5dee\u5f02\u3002 </p>"},{"location":"start/development-environment.html","title":"\u5b89\u88c5\u672c\u5730\u5f00\u53d1\u73af\u5883","text":"<p>\u5e94\u7528\u5f00\u53d1\u73af\u5883\u6240\u9700\u5b89\u88c5\u7684\u5de5\u5177\u5305\u62ecJDK\u3001Maven\u3001Eclipse \u548c IDEA \u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5\u4e86\u8fd9\u4e9b\u5f00\u53d1\u5de5\u5177\uff0c\u8bf7\u8df3\u8fc7\u672c\u8282\u3002</p>"},{"location":"start/development-environment.html#jdk","title":"JDK\u7ea6\u675f\u53ca\u5b89\u88c5\u6b65\u9aa4","text":"<p>1.JDK\u7248\u672c</p> <p>JDK \u7248\u672c\u8981\u6c42 17 \u4ee5\u4e0a\u3002</p> <p>2.JDK\u4e0b\u8f7d</p> <p>\u8bf7\u5230JDK 17 \u7248\u672c\u7684\u5b98\u65b9\u5730\u5740\u4e0b\u8f7d\u3002</p> <p>3.JDK\u5b89\u88c5</p> <p>\u5728\u5b98\u7f51\u4e0b\u8f7dJDK\u5b89\u88c5\u5305\u540e\uff0c\u9009\u62e9\u5408\u9002\u7684\u5b89\u88c5\u8def\u5f84\u5b89\u88c5JDK\u3002</p> <p>\u8fd9\u91cc\u4ee5windows\u7cfb\u7edf\u4e3a\u4f8b\uff1a</p> <p>\u8bbe\u7f6eJAVA_HOME\u73af\u5883\u53d8\u91cf\uff0c\u6307\u5411Java\u5b89\u88c5\u76ee\u5f55\u3002\u5c06%JAVA_HOME%\\bin\u6dfb\u52a0\u5230\u7cfb\u7edf\u8def\u5f84path\u4e2d\u3002\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u4f7f\u7528java -version\u547d\u4ee4\u9a8c\u8bc1\u662f\u5426\u5b89\u88c5\u6210\u529f\uff0cwindows\u73af\u5883\u4e0b\u56de\u663e\u5982\u4e0b\uff1a</p> <pre><code>C:\\&gt; java -version \njava version \"17.0.5\" 2022-10-18 LTS\nJava(TM) SE Runtime Environment (build 17.0.5+9-LTS-191)\nJava HotSpot(TM) 64-Bit Server VM (build 17.0.5+9-LTS-191, mixed mode, sharing)\n</code></pre>"},{"location":"start/development-environment.html#maven","title":"Maven\u5b89\u88c5\u6b65\u9aa4","text":"<p>Maven\u662f\u4e00\u6b3e\u96c6\u9879\u76ee\u7ba1\u7406\u3001\u4ee3\u7801\u7f16\u8bd1\u3001\u5de5\u7a0b\u7ba1\u7406\u7b49\u7b49\u80fd\u529b\u4e8e\u4e00\u4f53\u7684\u5f00\u53d1\u5de5\u5177\u3002</p>"},{"location":"start/development-environment.html#_2","title":"\u524d\u63d0\u6761\u4ef6","text":"<p>JDK\u5df2\u7ecf\u5b89\u88c5\u6210\u529f\u3002</p>"},{"location":"start/development-environment.html#_3","title":"\u5b89\u88c5\u6b65\u9aa4","text":"<ul> <li>\u5728\u5b98\u65b9\u5730\u5740\u4e0b\u8f7dMaven\u5b89\u88c5\u5305\u3002</li> <li>\u89e3\u538bMaven\u5b89\u88c5\u5305\u5230\u672c\u673a\u8def\u5f84\u3002</li> <li>\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf:</li> <li>\u8bbe\u7f6eM2_HOME\u73af\u5883\u53d8\u91cf\uff0c\u6307\u5411Maven\u5b89\u88c5\u76ee\u5f55\u3002</li> <li>\u5c06%M2_HOME%\\bin\u6dfb\u52a0\u5230\u7cfb\u7edf\u8def\u5f84path\u4e2d\u3002</li> <li>\u7ed3\u679c\u9a8c\u8bc1</li> </ul> <p>\u4f7f\u7528mvn -version\u547d\u4ee4\u9a8c\u8bc1\u662f\u5426\u5b89\u88c5\u6210\u529f\uff0cwindows\u73af\u5883\u4e0b\u56de\u663e\u5982\u4e0b\uff1a</p> <pre><code>C:\\&gt;mvn -version \nApache Maven 3.8.4\n</code></pre>"},{"location":"start/development-environment.html#eclipse","title":"Eclipse\u5b89\u88c5","text":""},{"location":"start/development-environment.html#_4","title":"\u524d\u63d0\u6761\u4ef6","text":"<p>a.JDK\u5df2\u7ecf\u5b89\u88c5\u3002</p> <p>b.Maven\u5df2\u7ecf\u5b89\u88c5\u3002</p>"},{"location":"start/development-environment.html#_5","title":"\u5b89\u88c5\u6b65\u9aa4","text":"<p>a.\u5728\u5b98\u65b9\u5730\u5740\u4e0b\u8f7dEclipse\u5b89\u88c5\u5305\u3002</p> <p>b.\u5b89\u88c5Eclipse\u5230\u672c\u673a\u3002</p> <p>c.\uff08\u53ef\u9009\uff09\u5c06\u4e4b\u524dMaven\u5b89\u88c5\u4e2d\u4ecb\u7ecd\u7684\u63d2\u4ef6m2eclipse\u89e3\u538b\u5230Eclipse\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684plugins\u548cfeatures\u76ee\u5f55\u3002\u6700\u65b0\u7684Eclipse\u7248\u672c</p> <p>\u4e2d\u5e26\u6709Maven\u63d2\u4ef6\uff0c\u4e0d\u8981\u8fdb\u884c\u6b64\u64cd\u4f5c</p> <p>d.\u542f\u52a8Eclipse\uff0c\u914d\u7f6ejre\u3001maven settings\u4ee5\u53ca\u9ed8\u8ba4\u7f16\u7801\u683c\u5f0f\u4e3autf-8\u3002</p>"},{"location":"start/development-environment.html#idea","title":"IDEA\u5b89\u88c5","text":""},{"location":"start/development-environment.html#_6","title":"\u524d\u63d0\u6761\u4ef6","text":"<p>a.JDK\u5df2\u7ecf\u5b89\u88c5\u3002</p> <p>b.Maven\u5df2\u7ecf\u5b89\u88c5\u3002</p>"},{"location":"start/development-environment.html#_7","title":"\u5b89\u88c5\u6b65\u9aa4","text":"<p>a. \u5728\u5b98\u65b9\u7f51\u7ad9\u4e0b\u8f7d IDEA \u5b89\u88c5\u5305\uff0c\u6536\u8d39\u7248\u6216\u8005\u793e\u533a\u7248\u7684\u6309\u4e2a\u4eba\u9700\u6c42\u3002</p> <p>b. \u8bbe\u7f6e\u7f16\u7801\u683c\u5f0f\u90fd\u4e3a utf-8\u3002</p> <p>\u6253\u5f00IDEA\uff0c\u9009\u62e9 File -&gt; Settings -&gt; Editor -&gt; File Encoding \u628a project Encoding \u548c default encoding for properties files \u6539\u4e3a utf-8\u3002</p> <p>c. \u8bbe\u7f6emaven \u914d\u7f6e</p> <p>\u6253\u5f00IDEA\uff0c\u9009\u62e9 File -&gt; Settings -&gt; Build\uff0cExecution,Deployment -&gt; Bulid Tools -&gt; Maven \u6ce8\u610f\u914d\u7f6e Maven home directory \u548c User settings file</p>"},{"location":"start/first-sample.html","title":"\u5f00\u53d1\u7b2c\u4e00\u4e2a\u5fae\u670d\u52a1\u5e94\u7528","text":""},{"location":"start/first-sample.html#_2","title":"\u51c6\u5907\u5de5\u4f5c","text":"<p>\u5728\u5f00\u53d1\u7b2c\u4e00\u4e2aJava-Chassis\u5fae\u670d\u52a1\u4e4b\u524d\uff0c\u8bf7\u5148\u786e\u4fdd\u672c\u5730\u5f00\u53d1\u73af\u5883\u5df2\u7ecf\u51c6\u5907\u5c31\u7eea\uff0c\u53c2\u8003\u5b89\u88c5\u672c\u5730\u5f00\u53d1\u73af\u5883\u3002</p> <p>\u8fd0\u884c\u8fd9\u4e9b\u4f8b\u5b50\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5b89\u88c5\u6ce8\u518c\u4e2d\u5fc3 \u548c\u914d\u7f6e\u4e2d\u5fc3 \u3002\u534e\u4e3a\u4e91\u63d0\u4f9b\u4e00\u4e2a\u51fa\u8272\u7684\u672c\u5730\u8f7b\u91cf\u5316\u5fae\u670d\u52a1\u5f15\u64ce , \u53ef\u4ee5\u76f4\u63a5\u4e0b\u8f7d\u5b89\u88c5\u4f7f\u7528\uff0c\u5b83\u5305\u542b\u4e86\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\u3002</p> <p>Java Chassis\u4f9d\u8d56\u4e8eSpring Boot\uff0c\u5982\u679c\u5bf9\u4e8eSpring Boot\u6bd4\u8f83\u964c\u751f\uff0c\u53ef\u4ee5\u5148\u901a\u8fc7 Spring Boot\u5165\u95e8 \u4e86\u89e3\u3002 </p>"},{"location":"start/first-sample.html#_3","title":"\u4f8b\u5b50\u4ecb\u7ecd","text":"<p>Basic\u793a\u4f8b \u5305\u542b\u4e863\u4e2a\u5fae\u670d\u52a1\uff1a gateway, provider, consumer\u3002 \u8fd93\u4e2a\u670d\u52a1\u5b8c\u6210\u4e86\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u5fae\u670d\u52a1\u67b6\u6784\u3002 \u5176\u4e2d provider \u63d0\u4f9b\u4e00\u4e2a REST \u63a5\u53e3\uff0c consumer \u8c03\u7528 provider \u7684 REST \u63a5\u53e3\u5b8c\u6210\u540c\u6837\u7684\u529f\u80fd\u3002 gateway \u4f5c\u4e3a\u5fae\u670d\u52a1\u7684\u63a5\u5165\u7aef\uff0c \u8d1f\u8d23\u6240\u6709\u5916\u90e8\u8bf7\u6c42\u7684\u63a5\u5165\u3002</p> <p>\u5982\u679c\u5df2\u7ecf\u4e86\u89e3 JAVA + MAVEN \u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\uff0c \u53ef\u4ee5\u76f4\u63a5\u4e0b\u8f7d\u5e76\u8fd0\u884c\u8fd9\u4e2a\u793a\u4f8b\u3002 \u4e0b\u9762\u4ecb\u7ecd\u8be5\u793a\u4f8b\u7684\u5173\u952e\u5f00\u53d1\u6b65\u9aa4\u3002</p>"},{"location":"start/first-sample.html#rest","title":"\u5f00\u53d1\u4e00\u4e2a\u5e26 REST \u63a5\u53e3\u7684\u5fae\u670d\u52a1","text":""},{"location":"start/first-sample.html#pom","title":"\u914d\u7f6epom\u6587\u4ef6","text":"<p>\u521b\u5efa\u4e00\u4e2a\u7a7a\u7684maven\u5de5\u7a0b\u3002\u5efa\u8bae\u5148\u914d\u7f6e<code>dependencyManagement</code>\u6765\u7ba1\u7406\u4f9d\u8d56\u9879</p> <pre><code>\n&lt;dependencyManagement&gt;\n &lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-dependencies&lt;/artifactId&gt;\n &lt;version&gt;${java-chassis-dependencies.version}&lt;/version&gt;\n &lt;type&gt;pom&lt;/type&gt;\n &lt;scope&gt;import&lt;/scope&gt;\n &lt;/dependency&gt;\n &lt;/dependencies&gt;\n&lt;/dependencyManagement&gt;\n</code></pre> <p>\u4f9d\u8d56\u9879\u9700\u8981\u5f15\u5165<code>solution-basic</code>, \u5e76\u4e14\u5f15\u5165\u6ce8\u518c\u4e2d\u5fc3\u3001\u914d\u7f6e\u4e2d\u5fc3\u548cLogger\u7cfb\u7edf\u7684\u4f9d\u8d56</p> <pre><code>\n&lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;solution-basic&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;!-- using log4j2 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;\n &lt;artifactId&gt;log4j-slf4j-impl&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;\n &lt;artifactId&gt;log4j-api&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;\n &lt;artifactId&gt;log4j-core&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;!-- using service-center &amp; kie --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;registry-service-center&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;config-kie&lt;/artifactId&gt;\n &lt;/dependency&gt;\n &lt;!-- using java chassis http transport --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-standalone&lt;/artifactId&gt;\n &lt;/dependency&gt;\n&lt;/dependencies&gt;\n</code></pre> <p><code>solution-basic</code>\u4e2d\u5df2\u7ecf\u5305\u542b\u4e86\u5e38\u89c1\u573a\u666f\u4e0b\u5f00\u53d1Java-Chassis\u5fae\u670d\u52a1\u6240\u9700\u7684\u5168\u90e8\u4f9d\u8d56\u9879\u3002</p> <p>\u5f15\u5165<code>maven-compiler-plugin</code>\u63d2\u4ef6\uff0c\u4f7f\u9879\u76ee\u6253\u5305\u65f6\u4fdd\u7559\u65b9\u6cd5\u53c2\u6570\u540d\uff1a</p> <pre><code>\n&lt;plugin&gt;\n &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n &lt;version&gt;${maven-compiler-plugin.version}&lt;/version&gt;\n &lt;configuration&gt;\n &lt;compilerArgument&gt;-parameters&lt;/compilerArgument&gt;\n &lt;source&gt;17&lt;/source&gt;\n &lt;target&gt;17&lt;/target&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;\n</code></pre>"},{"location":"start/first-sample.html#_4","title":"\u6dfb\u52a0\u914d\u7f6e\u6587\u4ef6","text":"<p>\u6309\u7167Spring Boot\u5e94\u7528\u7a0b\u5e8f\u8981\u6c42\uff0c\u589e\u52a0 <code>application.yaml</code> \u6587\u4ef6 \uff0c\u5b58\u653e\u5728<code>resources</code>\u76ee\u5f55\u4e2d\u3002</p> <p>\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\uff0c\u8fd9\u4efd\u6587\u4ef6\u8868\u793a\u5f53\u524d\u5f00\u53d1\u7684\u662f<code>basic-application</code>\u5e94\u7528\u4e0b\u7684\u540d\u4e3a<code>provider</code>\u7684\u5fae\u670d\u52a1\uff0c\u7248\u672c\u4e3a0.0.1\u3002\u8be5\u5fae\u670d\u52a1\u8fde\u63a5\u7684\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740\u4e3a<code>http://localhost:30100</code> \uff0c\u914d\u7f6e\u4e2d\u5fc3\u5730\u5740\u4e3a<code>http://localhost:30110</code>\u3002 \u8be5\u5fae\u670d\u52a1\u76d1\u542cHTTP\u534f\u8bae\u7684<code>9093</code>\u7aef\u53e3\u3002</p> <pre><code>servicecomb:\n service:\n application: basic-application\n name: provider\n version: 0.0.1\n rest:\n address: 0.0.0.0:9093\n # \u6ce8\u518c\u53d1\u73b0\n registry:\n sc:\n address: http://localhost:30100\n # \u52a8\u6001\u914d\u7f6e\n kie:\n serverUri: http://localhost:30110\n</code></pre>"},{"location":"start/first-sample.html#_5","title":"\u7f16\u5199\u542f\u52a8\u7c7b","text":"<p>Java Chassis\u5e94\u7528\u662f\u4e00\u4e2a\u6807\u51c6\u7684Spring Boot\u5e94\u7528\u3002\u672c\u793a\u4f8b\u4e2d\uff0c\u8bbe\u7f6e <code>WebApplicationType.NONE</code>\uff0c \u8fd9\u6837\u4f1a\u4f7f\u7528 Java Chassis\u81ea\u5e26\u7684\u9ad8\u6027\u80fd HTTP \u5bb9\u5668\uff0c\u800c\u4e0d\u4f7f\u7528 Spring Boot\u81ea\u5e26\u7684WEB\u5bb9\u5668\u3002</p> <pre><code>\n@SpringBootApplication\npublic class ProviderApplication {\n public static void main(String[] args) throws Exception {\n try {\n new SpringApplicationBuilder()\n .web(WebApplicationType.NONE)\n .sources(ProviderApplication.class)\n .run(args);\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}\n</code></pre>"},{"location":"start/first-sample.html#_6","title":"\u7f16\u5199\u670d\u52a1","text":"<p>\u672c\u4f8b\u5b50\u91c7\u7528\u5951\u7ea6\u4f18\u5148\u7684\u5f00\u53d1\u65b9\u6cd5\u3002</p> <p>\u9996\u5148\u5b9a\u4e49\u670d\u52a1\u63a5\u53e3\uff1a</p> <pre><code>@RequestMapping(path = \"/provider\")\npublic interface ProviderService {\n @GetMapping(\"/sayHello\")\n String sayHello(@RequestParam(\"name\") String name);\n\n @GetMapping(\"/exampleConfig\")\n String exampleConfig();\n}\n</code></pre> <p>\u5728\u5de5\u7a0b\u4e2d\u6dfb\u52a0\u4e00\u4e2aREST\u63a5\u53e3\u7c7b\u7528\u4e8e\u63a5\u6536\u8bf7\u6c42\uff1a</p> <pre><code>@RestSchema(schemaId = \"ProviderController\", schemaInterface = ProviderService.class)\npublic class ProviderController implements ProviderService {\n private DynamicProperties dynamicProperties;\n\n private String example;\n\n @Autowired\n public ProviderController(DynamicProperties dynamicProperties) {\n this.dynamicProperties = dynamicProperties;\n this.example = this.dynamicProperties.getStringProperty(\"basic.example\",\n value -&gt; this.example = value, \"not set\");\n }\n\n @Override\n public String sayHello(String name) {\n return \"Hello \" + name;\n }\n\n @Override\n public String exampleConfig() {\n return example;\n }\n}\n</code></pre> <p>\u8be5\u7c7b\u5b9e\u73b0\u4e86\u4e24\u4e2aREST\u63a5\u53e3\uff0c\u5176\u4e2d<code>sayHello</code>\u5b9e\u73b0\u4e86\u4e00\u4e2a\u7b80\u5355\u7684echo\u7a0b\u5e8f\uff1b<code>exampleConfig</code>\u6f14\u793a\u4e86\u5982\u4f55\u901a\u8fc7\u914d\u7f6e\u4e2d\u5fc3\u4e0b\u53d1\u914d\u7f6e\u9879\uff0c\u5e76\u52a8\u6001\u76d1\u542c\u914d\u7f6e\u9879\u7684\u53d8\u5316\u3002</p>"},{"location":"start/first-sample.html#_7","title":"\u6dfb\u52a0\u65e5\u5fd7\u914d\u7f6e\u6587\u4ef6","text":"<p>\u672c\u4f8b\u5b50\u5f15\u5165\u4e86log4j2\u7ec4\u4ef6\u3002\u5982\u679c\u60f3\u8981\u770b\u5230\u8fd0\u884c\u65e5\u5fd7\uff0c\u8fd8\u9700\u8981\u624b\u52a8\u6dfb\u52a0\u4e00\u4efd\u65e5\u5fd7\u914d\u7f6e\u6587\u4ef6\uff0c\u6587\u4ef6\u5b58\u653e\u4f4d\u7f6e\u4e3a<code>resources\\log4j2.xml</code>\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a</p> <pre><code>\n&lt;Configuration status=\"INFO\"&gt;\n &lt;Appenders&gt;\n &lt;Console name=\"Console\" target=\"SYSTEM_OUT\"&gt;\n &lt;PatternLayout pattern=\"[%d][%t][%p]%m [%c:%L]%n\"/&gt;\n &lt;/Console&gt;\n &lt;/Appenders&gt;\n &lt;Loggers&gt;\n &lt;Root level=\"INFO\"&gt;\n &lt;AppenderRef ref=\"Console\"/&gt;\n &lt;/Root&gt;\n &lt;/Loggers&gt;\n&lt;/Configuration&gt;\n</code></pre>"},{"location":"start/first-sample.html#_8","title":"\u8c03\u7528\u670d\u52a1","text":"<p>\u5728 Consumer \u91cc\u9762\uff0c\u6f14\u793a\u4e86\u5982\u4f55\u8c03\u7528 Provider \u7684\u670d\u52a1\u3002 \u9996\u5148\u58f0\u660e\u4e00\u4e2a PRC \u63a5\u53e3\u7684 Bean\u3002</p> <pre><code>@Configuration\npublic class ProviderServiceConfiguration {\n @Bean\n public ProviderService providerService() {\n return Invoker.createProxy(\"provider\", \"ProviderController\", ProviderService.class);\n }\n}\n</code></pre> <p>\u4f7f\u7528 @Autowired \u58f0\u660e RPC \u63a5\u53e3\u7684\u8fdc\u7a0b\u5f15\u7528\uff0c \u7136\u540e\u53ef\u4ee5\u50cf\u8c03\u7528\u672c\u5730\u65b9\u6cd5\u4e00\u6837\uff0c\u8bbf\u95ee Provider \u7684\u670d\u52a1\u3002</p> <pre><code>@RestSchema(schemaId = \"ConsumerController\", schemaInterface = ConsumerService.class)\npublic class ConsumerController implements ConsumerService {\n private ProviderService providerService;\n\n @Autowired\n public void setProviderService(ProviderService providerService) {\n this.providerService = providerService;\n }\n\n @Override\n public String sayHello(String name) {\n return providerService.sayHello(name);\n }\n\n @Override\n public String exampleConfig() {\n return providerService.exampleConfig();\n }\n}\n</code></pre>"},{"location":"start/first-sample.html#_9","title":"\u5fae\u670d\u52a1\u7f51\u5173","text":"<p>\u5fae\u670d\u52a1\u7f51\u5173\u662f\u4e00\u4e2a\u666e\u901a\u7684\u5fae\u670d\u52a1\uff0c\u9700\u8981\u989d\u5916\u5f15\u5165 <code>edge-core</code> \u3002</p> <pre><code>\n&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;edge-core&lt;/artifactId&gt;\n&lt;/dependency&gt;\n</code></pre>"},{"location":"start/first-sample.html#_10","title":"\u542f\u52a8\u670d\u52a1","text":"<p>\u4f9d\u6b21\u542f\u52a8 <code>ProviderApplication</code>\u3001<code>ConsumerApplication</code>\u548c<code>GatewayApplication</code>\uff0c \u8bbf\u95ee <code>http://localhost:9090/sayHello?name=World</code> \uff0c\u53ef\u4ee5\u5f97\u5230\u54cd\u5e94<code>\"Hello World!\"</code>\u3002</p> <p>\u6253\u5f00\u6ce8\u518c\u4e2d\u5fc3\u3001\u914d\u7f6e\u4e2d\u5fc3\u63a7\u5236\u53f0\uff0c\u8fd8\u53ef\u4ee5\u770b\u5230\u5fae\u670d\u52a1\u7684\u5b9e\u4f8b\u5217\u8868\u3002\u901a\u8fc7\u914d\u7f6e\u4e2d\u5fc3\u7ed9 <code>ProviderApplication</code> \u6dfb\u52a0\u914d\u7f6e\uff0c \u8bbf\u95ee <code>http://localhost:9090/exampleConfig</code> , \u53ef\u4ee5\u5f97\u5230\u54cd\u5e94\uff0c\u54cd\u5e94\u5305\u542b\u4e86\u6700\u65b0\u7684\u914d\u7f6e\u9879\u7684\u503c\u3002 </p>"},{"location":"start/first-sample.html#nacos","title":"\u4f7f\u7528<code>Nacos</code>\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3","text":"<p>\u672c\u4f8b\u5b50\u8fd8\u53ef\u4ee5\u4f7f\u7528 <code>Nacos</code> \u4f5c\u4e3a\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\u3002 </p> <p>\u7f16\u8bd1\uff1a</p> <pre><code>mvn clean install -Pnacos\n</code></pre> <p>\u8fd0\u884c:</p> <pre><code>java -Dspring.profiles.active=nacos -jar basic-provider-2.0-SNAPSHOT.jar\n</code></pre> <p>\u4e5f\u53ef\u4ee5\u5728IDE\u91cc\u9762\u9009\u62e9 MAVEN \u7684 nacos PROFILE\uff0c\u5e76\u4fee\u6539 application.yml \u7684 <code>spring.profiles.active</code> \u4e3a nacos. </p>"},{"location":"start/terminology.html","title":"\u672f\u8bed\u8868","text":"\u7f29\u7565\u8bed \u82f1\u6587\u8bcd\u6c47 \u4e2d\u6587\u8bcd\u6c47 \u89e3\u91ca Application Application \u5e94\u7528 \u5e94\u7528\u4ee3\u8868\u4e00\u4e2a\u8f6f\u4ef6\u5e94\u7528\u7684\u903b\u8f91\u5b9e\u4f53\uff0c\u8868\u793a\u4e00\u4e2a\u6709\u4e1a\u52a1\u529f\u80fd\u5448\u73b0\u7ed9\u7528\u6237\u7684\u8ba1\u7b97\u673a\u8f6f\u4ef6\u5e94\u7528\u3002\u4e00\u4e2a\u4ee5\u5fae\u670d\u52a1\u5316\u67b6\u6784\u6784\u5efa\u7684\u5e94\u7528\u901a\u5e38\u7531\u591a\u4e2a\u5fae\u670d\u52a1\u7ec4\u6210\u3002 Service Service \u5fae\u670d\u52a1 \u5fae\u670d\u52a1\u662f\u4e00\u79cd\u8f7b\u91cf\u7ea7SOA\u67b6\u6784\uff0c\u901a\u5e38\u7528\u6765\u63cf\u8ff0\u5e7f\u6cdb\u7528\u4e8e\u4e91\u5e94\u7528\u3001\u4e92\u8054\u7f51\u5e94\u7528\u7684\u4e00\u79cd\u677e\u8026\u5408\u5206\u5e03\u5f0f\u67b6\u6784\u3002 Instance Instance \u5fae\u670d\u52a1\u5b9e\u4f8b \u4e00\u4e2a\u5fae\u670d\u52a1\u7684\u6700\u5c0f\u8fd0\u884c\u548c\u90e8\u7f72\u5355\u5143\uff0c\u901a\u5e38\u5bf9\u5e94\u4e00\u4e2a\u5e94\u7528\u8fdb\u7a0b\u3002 Provider Provider \u670d\u52a1\u63d0\u4f9b\u8005 \u5728\u5fae\u670d\u52a1\u8c03\u7528\u5173\u7cfb\u4e2d\u5904\u4e8e\u88ab\u8c03\u7528\u4e00\u65b9\u7684\u670d\u52a1\u3002 Consumer Consumer \u670d\u52a1\u6d88\u8d39\u8005 \u5728\u5fae\u670d\u52a1\u8c03\u7528\u5173\u7cfb\u4e2d\u5904\u4e8e\u8c03\u7528\u53d1\u8d77\u65b9\u7684\u670d\u52a1\u3002 Schema Schema \u5fae\u670d\u52a1\u5951\u7ea6 \u5fae\u670d\u52a1\u5951\u7ea6\u662f\u5bf9\u5916\u63a5\u53e3\u7684OpenAPI\u8868\u793a\u3002OpenAPI\u589e\u5f3a\u4e86\u5fae\u670d\u52a1\u7684\u53ef\u89c1\u6027\uff0c\u65b9\u4fbf\u670d\u52a1\u7684\u5206\u53d1\u3001\u4f7f\u7528\u548c\u6cbb\u7406\u3002 Code Style Code Style \u7f16\u7a0b\u6a21\u578b \u7f16\u7a0b\u6a21\u578b\u6307\u5982\u4f55\u8fdb\u884c\u670d\u52a1\u63a5\u53e3\u5f00\u53d1\u548c\u8c03\u7528\uff0cJava Chassis\u63d0\u4f9b\u4e86Spring Web MVC\u3001JAX RS\u7b49\u7f16\u7a0b\u6a21\u578b\u3002\u7f16\u7a0b\u6a21\u578b\u72ec\u7acb\u4e8e\u5904\u7406\u94fe\u548c\u901a\u4fe1\u6a21\u578b Filter Filter \u5904\u7406\u94fe \u5904\u7406\u94fe\u5b9a\u4e49\u4e86\u4e00\u4e2a\u8bf7\u6c42\u7684\u5904\u7406\u6d41\u7a0b\uff0c\u5305\u62ec\u7f16\u89e3\u7801\u3001\u670d\u52a1\u6cbb\u7406\u3001\u7f51\u7edc\u53d1\u9001\u7b49\u3002 Transport Transport \u901a\u4fe1\u6a21\u578b \u901a\u4fe1\u6a21\u578b\u5b9a\u4e49\u4e86\u5bf9\u8c61\u5982\u4f55\u7f16\u89e3\u7801\uff0c\u4f7f\u7528\u4ec0\u4e48\u534f\u8bae\u4f20\u8f93\u7b49\u3002Java Chassis\u63d0\u4f9b\u4e86REST\u3001HIGHWAY\u7b49\u901a\u4fe1\u6a21\u578b\u3002 Load Balance Load Balance \u8d1f\u8f7d\u5747\u8861 \u5f53\u5e94\u7528\u8bbf\u95ee\u4e00\u4e2a\u5177\u6709\u591a\u4e2a\u5b9e\u4f8b\u7684\u5fae\u670d\u52a1\u65f6\uff0c\u4f1a\u6d89\u53ca\u5230\u8def\u7531\u8d1f\u8f7d\u5747\u8861\u3002\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\uff0c\u652f\u6301\u968f\u673a\uff0c\u8f6e\u8be2\u3001\u4f1a\u8bdd\u4fdd\u6301\u548c\u57fa\u4e8e\u54cd\u5e94\u65f6\u95f4\u7684\u6743\u503c\u7b49\u591a\u79cd\u8d1f\u8f7d\u5747\u8861\u8def\u7531\u7b56\u7565\u3002 Rate Limiting Rate Limiting \u9650\u6d41 \u5f53\u8d44\u6e90\u6210\u4e3a\u74f6\u9888\u65f6\uff0c\u670d\u52a1\u6846\u67b6\u9700\u8981\u5bf9\u6d88\u8d39\u8005\u7684\u8bbf\u95ee\u8bf7\u6c42\u505a\u9650\u6d41\uff0c\u542f\u52a8\u6d41\u63a7\u4fdd\u62a4\u673a\u5236\u3002\u5728\u670d\u52a1\u6d88\u8d39\u8005\u7aef\u548c\u63d0\u4f9b\u8005\u7aef\u5747\u53ef\u8fdb\u884c\u6d41\u91cf\u63a7\u5236\u3002\u5728\u670d\u52a1\u6d88\u8d39\u7aef\uff0c\u53ef\u4ee5\u9650\u5236\u53d1\u5f80\u67d0\u4e2a\u5fae\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u8bf7\u6c42\u9891\u7387\uff1b\u5728\u670d\u52a1\u63d0\u4f9b\u7aef\uff0c\u53ef\u4ee5\u9650\u5236\u6bcf\u4e2a\u5fae\u670d\u52a1\u6d88\u8d39\u7aef\u53d1\u8fc7\u6765\u7684\u8bf7\u6c42\u9891\u7387\uff0c\u4e5f\u53ef\u4ee5\u6839\u636e\u670d\u52a1\u63d0\u4f9b\u7aef\u8d44\u6e90\u6d88\u8017\u60c5\u51b5\u786e\u5b9a\u603b\u7684\u8bf7\u6c42\u9891\u7387\u9650\u5236\uff0c\u9632\u6b62\u670d\u52a1\u56e0\u8d44\u6e90\u8017\u5c3d\u800c\u5d29\u6e83\u3002 Service Degrade Service Degrade \u964d\u7ea7 \u670d\u52a1\u964d\u7ea7\u4e3b\u8981\u5305\u62ec\u5c4f\u853d\u964d\u7ea7\u548c\u5bb9\u9519\u964d\u7ea7\u4e24\u79cd\u7b56\u7565\uff1a\u5c4f\u853d\u964d\u7ea7\u662f\u6307\u5f53\u5916\u754c\u7684\u89e6\u53d1\u6761\u4ef6\u8fbe\u5230\u67d0\u4e2a\u4e34\u754c\u503c\u65f6\uff0c\u7531\u8fd0\u7ef4\u4eba\u5458/\u5f00\u53d1\u4eba\u5458\u51b3\u7b56\uff0c\u5bf9\u67d0\u7c7b\u6216\u8005\u67d0\u4e2a\u670d\u52a1\u8fdb\u884c\u5f3a\u5236\u964d\u7ea7\u3002\u5bb9\u9519\u964d\u7ea7\u662f\u6307\u5f53\u975e\u6838\u5fc3\u670d\u52a1\u4e0d\u53ef\u7528\u65f6\uff0c\u53ef\u4ee5\u5bf9\u6545\u969c\u670d\u52a1\u505a\u4e1a\u52a1\u903b\u8f91\u653e\u901a\uff0c\u4ee5\u4fdd\u969c\u6838\u5fc3\u670d\u52a1\u7684\u8fd0\u884c\u3002 Fault Tolerance Fault Tolerance \u5bb9\u9519 \u5bb9\u9519\u662f\u6d88\u8d39\u8005\u8bbf\u95ee\u670d\u52a1\u65f6\u51fa\u73b0\u5f02\u5e38\u7684\u573a\u666f\u4e0b\u7684\u4e00\u79cd\u5904\u7406\u7b56\u7565\uff0c\u51fa\u73b0\u5f02\u5e38\u540e\u7531\u670d\u52a1\u6846\u67b6\u81ea\u52a8\u9009\u62e9\u65b0\u7684\u670d\u52a1\u8def\u7531\u8fdb\u884c\u8c03\u7528\u3002 Circuit Breaker Circuit Breaker \u7194\u65ad \u5fae\u670d\u52a1\u4e4b\u95f4\u901a\u5e38\u5b58\u5728\u4f9d\u8d56\u5173\u7cfb\uff0c\u670d\u52a1\u8c03\u7528\u94fe\u8def\u53ef\u80fd\u5305\u542b\u591a\u4e2a\u5fae\u670d\u52a1\uff0c\u5982\u679c\u94fe\u8def\u4e2d\u4e00\u4e2a\u6216\u591a\u4e2a\u670d\u52a1\u8bbf\u95ee\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4f1a\u5bfc\u81f4\u5165\u53e3\u670d\u52a1\u7684\u8bf7\u6c42\u4e0d\u65ad\u5806\u79ef\uff0c\u6301\u7eed\u6d88\u8017\u66f4\u591a\u7684\u7ebf\u7a0b\u3001io\u8d44\u6e90\uff0c\u6700\u7ec8\u7531\u4e8e\u8d44\u6e90\u7d2f\u79ef\u4f7f\u7cfb\u7edf\u51fa\u73b0\u74f6\u9888\uff0c\u9020\u6210\u66f4\u591a\u670d\u52a1\u4e0d\u53ef\u7528\uff0c\u4ea7\u751f\u96ea\u5d29\u6548\u5e94\u3002\u7194\u65ad\u673a\u5236\u5c31\u662f\u9488\u5bf9\u4e0a\u8ff0\u573a\u666f\u8bbe\u8ba1\u7684\uff0c\u5f53\u67d0\u4e2a\u76ee\u6807\u670d\u52a1\u54cd\u5e94\u7f13\u6162\u6216\u8005\u6709\u5927\u91cf\u8d85\u65f6\u60c5\u51b5\u53d1\u751f\u65f6\uff0c\u7194\u65ad\u8be5\u670d\u52a1\u7684\u8c03\u7528\uff0c\u5bf9\u4e8e\u540e\u7eed\u8c03\u7528\u8bf7\u6c42\uff0c\u4e0d\u518d\u7ee7\u7eed\u8c03\u7528\u76ee\u6807\u670d\u52a1\uff0c\u76f4\u63a5\u8fd4\u56de\uff0c\u5feb\u901f\u91ca\u653e\u8d44\u6e90\uff0c\u7b49\u5230\u8be5\u76ee\u6807\u670d\u52a1\u60c5\u51b5\u597d\u8f6c\u518d\u6062\u590d\u8c03\u7528\u3002 Bulkhead Bulkhead \u9694\u79bb\u4ed3 \u9694\u79bb\u4ed3\u662f\u4e00\u79cd\u5f02\u5e38\u68c0\u6d4b\u673a\u5236\uff0c\u5e38\u7528\u7684\u68c0\u6d4b\u65b9\u6cd5\u662f\u8bf7\u6c42\u8d85\u65f6\u3001\u6d41\u91cf\u8fc7\u5927\u7b49\u3002\u4e00\u822c\u7684\u8bbe\u7f6e\u53c2\u6570\u5305\u62ec\u8d85\u65f6\u65f6\u95f4\u3001\u6700\u5927\u5e76\u53d1\u8bf7\u6c42\u6570\u7b49\uff0c\u5f53\u8d85\u8fc7\u8d85\u65f6\u65f6\u95f4\u6216\u6700\u5927\u5e76\u53d1\u8bf7\u6c42\u6570\u65f6\uff0c\u8bb0\u5f55\u4e00\u6b21\u5f02\u5e38\uff0c\u5728\u7194\u65ad\u3001\u5b9e\u4f8b\u9694\u79bb\u673a\u5236\u4e2d\uff0c\u7528\u4e8e\u8ba1\u7b97\u9519\u8bef\u7387\u3002 Instance Isolation Instance Isolation \u5b9e\u4f8b\u9694\u79bb \u5b9e\u4f8b\u9694\u79bb\u901a\u8fc7\u68c0\u6d4b\u5b9e\u4f8b\u7684\u9519\u8bef\u7387\u3001\u8d85\u65f6\u8bf7\u6c42\u6570\u7b49\u6307\u6807\uff0c\u77ed\u6682\u7684\u5c4f\u853d\u6545\u969c\u5b9e\u4f8b\u7684\u8bbf\u95ee\uff0c\u964d\u4f4e\u9519\u8bef\u7387\u4ee5\u53ca\u9632\u6b62\u53d1\u751f\u96ea\u5d29\u6548\u5e94\u3002"},{"location":"transports/highway-rpc.html","title":"Highway","text":""},{"location":"transports/highway-rpc.html#_1","title":"\u5f00\u53d1\u8bf4\u660e","text":"<p>Highway\u662fJava Chassis\u7684\u9ad8\u6027\u80fd\u79c1\u6709TCP\u534f\u8bae, Highway\u534f\u8bae\u652f\u6301proto-buffer\u7f16\u7801\u3002\u53c2\u8003 Spring Boot\u96c6\u6210Java Chassis\u4ecb\u7ecd \uff0c\u5efa\u8bae\u5728\u9ad8\u6027\u80fd\u6a21\u5f0f\u4f7f\u7528Highway\u3002</p> <p>application.yaml \u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u793a\u4f8b\uff1a</p> <pre><code>servicecomb:\n highway:\n address: 0.0.0.0:7070\n</code></pre> <p>\u5176\u4e2d <code>0.0.0.0:7070</code> \u4ee3\u8868\u4f7f\u7528Highway\u534f\u8bae\uff0c\u5e76\u4e14\u76d1\u542c7070\u7aef\u53e3\u3002\u53ef\u4ee5\u901a\u8fc7\u5728\u5730\u5740\u540e\u9762\u8ffd\u52a0<code>sslEnabled=true</code>\u4f7f\u7528HTTPS\u901a\u4fe1\uff0c\u5177\u4f53\u4ecb\u7ecd\u89c1\u4f7f\u7528TLS\u901a\u4fe1\u7ae0\u8282\u3002</p>"},{"location":"transports/highway-rpc.html#_2","title":"\u914d\u7f6e\u8bf4\u660e","text":"\u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 servicecomb.highway.address \u670d\u52a1\u76d1\u542c\u5730\u5740\uff0c\u4e0d\u914d\u7f6e\u8868\u793a\u4e0d\u76d1\u542c servicecomb.highway.server.connection-limit Integer.MAX_VALUE \u5141\u8bb8\u5ba2\u6237\u7aef\u6700\u5927\u8fde\u63a5\u6570 servicecomb.highway.server.thread-count verticle-count highway server verticle\u5b9e\u4f8b\u6570(Deprecated) servicecomb.highway.server.verticle-count verticle-count highway server verticle\u5b9e\u4f8b\u6570 servicecomb.highway.client.thread-count verticle-count highway client verticle\u5b9e\u4f8b\u6570(Deprecated) servicecomb.highway.client.verticle-count verticle-count highway client verticle\u5b9e\u4f8b\u6570 servicecomb.Provider.requestWaitInPoolTimeout${op-priority} 30000 \u5728\u540c\u6b65\u7ebf\u7a0b\u4e2d\u6392\u961f\u7b49\u5f85\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2 servicecomb.highway.server.requestWaitInPoolTimeout 30000 \u540cservicecomb.Provider.requestWaitInPoolTimeout${op-priority}, \u8be5\u914d\u7f6e\u9879\u4f18\u5148\u7ea7\u66f4\u9ad8\u3002"},{"location":"transports/http2.html","title":"REST over HTTP2\uff08Vert.x)","text":""},{"location":"transports/http2.html#_1","title":"\u5f00\u53d1\u4ecb\u7ecd","text":"<p>\u53c2\u8003 Spring Boot\u96c6\u6210Java Chassis\u4ecb\u7ecd \uff0c\u9ad8\u6027\u80fd\u6a21\u5f0f\u4f7f\u7528 REST over HTTP2\uff08Vert.x\uff09\u3002</p> <p>application.yaml \u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u793a\u4f8b\uff1a</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:8080?protocol=http2\n server:\n verticle-count: 8\n</code></pre> <ul> <li> <p>\u542f\u7528h2(Http2 + TLS)\u8fdb\u884c\u901a\u4fe1 \u670d\u52a1\u7aef\u5728\u914d\u7f6e\u670d\u52a1\u76d1\u542c\u5730\u5740\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u5728\u5730\u5740\u540e\u9762\u8ffd\u52a0<code>sslEnabled=true</code>\u5f00\u542fTLS\u901a\u4fe1\uff0c\u5177\u4f53\u4ecb\u7ecd\u89c1\u4f7f\u7528TLS\u901a\u4fe1\u7ae0\u8282\u3002\u7136\u540e\u518d\u8ffd\u52a0<code>protocol=http2</code>\u542f\u7528h2\u901a\u4fe1\u3002\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:8080?sslEnabled=true&amp;protocol=http2\n</code></pre> </li> <li> <p>\u542f\u7528h2c(Http2 without TLS)\u8fdb\u884c\u901a\u4fe1 \u670d\u52a1\u7aef\u5728\u914d\u7f6e\u670d\u52a1\u76d1\u542c\u5730\u5740\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u5728\u5730\u5740\u540e\u9762\u8ffd\u52a0<code>protocol=http2</code>\u542f\u7528h2c\u901a\u4fe1\u3002\u793a\u4f8b\u5982\u4e0b\uff1a</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:8080?protocol=http2\n</code></pre> </li> <li> <p>\u5ba2\u6237\u7aef\u4f1a\u901a\u8fc7\u4ece\u670d\u52a1\u4e2d\u5fc3\u8bfb\u53d6\u670d\u52a1\u7aef\u5730\u5740\u4e2d\u7684\u914d\u7f6e\u6765\u4f7f\u7528http2\u8fdb\u884c\u901a\u4fe1\u3002 </p> </li> </ul>"},{"location":"transports/http2.html#_2","title":"\u914d\u7f6e\u53c2\u8003","text":"\u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 \u6ce8\u610f servicecomb.rest.server.http2.useAlpnEnabled true \u662f\u5426\u542f\u7528 ALPN servicecomb.rest.server.http2.concurrentStreams 100 \u4e00\u6761\u8fde\u63a5\u4e2d\uff0c\u540c\u65f6\u652f\u6301\u7684\u6700\u5927\u7684stream\u5e76\u53d1\u91cf \u4ee5server\u7aef\u7684concurrentStreams\u548cclient\u7aef\u7684multiplexingLimit\u8f83\u5c0f\u503c\u4e3a\u51c6 servicecomb.rest.server.http2.HeaderTableSize 4096 servicecomb.rest.server.http2.pushEnabled true servicecomb.rest.server.http2.initialWindowSize 65535 servicecomb.rest.server.http2.maxFrameSize 16384 servicecomb.rest.server.http2.maxHeaderListSize Integer.MAX_VALUE servicecomb.Provider.requestWaitInPoolTimeout${op-priority} 30000 \u5728\u540c\u6b65\u7ebf\u7a0b\u4e2d\u6392\u961f\u7b49\u5f85\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2 servicecomb.rest.server.requestWaitInPoolTimeout 30000 \u540cservicecomb.Provider.requestWaitInPoolTimeout${op-priority}, \u8be5\u914d\u7f6e\u9879\u4f18\u5148\u7ea7\u66f4\u9ad8\u3002"},{"location":"transports/introduction.html","title":"\u591a\u534f\u8bae\u4ecb\u7ecd","text":"<p>Java Chassis\u63d0\u51fa\u7f16\u7a0b\u6a21\u578b\u548c\u901a\u4fe1\u6a21\u578b\u5206\u79bb\u7684\u521b\u65b0\u6982\u5ff5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u3001\u7b80\u6d01\u7684\u591a\u534f\u8bae\u901a\u4fe1\u5f00\u53d1\u3002\u7f16\u7a0b\u6a21\u578b\u6307\u7528\u6237\u5199\u4ee3\u7801\u7684\u65b9\u5f0f\uff0cJava Chassis\u975e\u5e38\u7075\u6d3b\u7684\u7f16\u7a0b\u6a21\u578b: </p> <ul> <li>Provider\u7f16\u7a0b\u6a21\u578b\uff1aJAX-RS\u3001Spring Web MVC\u3001\u900f\u660eRPC</li> <li>Consumer\u7f16\u7a0b\u6a21\u578b\uff1a\u900f\u660eRPC\u3001RestOperations\u3001InvokerUtils</li> </ul> <p>\u5f00\u53d1\u8005\u53ef\u4ee5\u5728\u9879\u76ee\u4e2d\u81ea\u7531\u7ec4\u5408Provider\u548cConsumer\u7684\u7f16\u7a0b\u6a21\u578b\uff0c\u5373\u5b58\u5728 3 * 3 \u79cd\u5f00\u53d1\u7ec4\u5408\uff0c\u6700\u63a8\u8350\u7684\u5f00\u53d1\u7ec4\u5408Provider\u91c7\u7528JAX-RS\uff0cConsumer\u91c7\u7528\u900f\u660eRPC\uff1b\u719f\u6089Spring Web MVC\u7684\u7528\u6237\u91c7\u7528Spring Web MVC\u548c\u900f\u660eRPC\u3002 </p> <p>\u7f16\u7a0b\u6a21\u578b\u548c\u6211\u4eec\u901a\u5e38\u6240\u8bf4\u7684\u591a\u534f\u8bae\u652f\u6301\u6ca1\u6709\u5173\u7cfb\u3002 \u591a\u534f\u8bae\u652f\u6301\u4e00\u822c\u6307\u7684\u662f\u5bf9\u8c61\u5982\u4f55\u7f16\u7801\uff0c\u6bd4\u5982\u91c7\u7528Json\u8fd8\u662f\u91c7\u7528proto-buffer, \u4ee5\u53ca\u901a\u4fe1\u534f\u8bae\u91c7\u7528\u4ec0\u4e48\uff0c\u6bd4\u5982\u91c7\u7528HTTP\u8fd8\u662f\u91c7\u7528\u79c1\u6709TCP\u534f\u8bae\u3002 \u5bf9\u8c61\u7f16\u7801\u65b9\u5f0f\u548c\u901a\u4fe1\u534f\u8bae\u7684\u7ec4\u5408\uff0c\u79f0\u4e3a\u901a\u4fe1\u6a21\u578b\u3002 Java Chassis\u7684\u901a\u4fe1\u6a21\u578b\u53ef\u4ee5\u5206\u6210\u4e24\u7c7b\uff1aREST \u548c Highway\u3002 </p> <ul> <li>REST\uff1a \u652f\u6301\u63a5\u53e3\u53c2\u6570\u4e0eHTTPQuery\u3001Path\u3001Header\u3001Body\u7684\u6620\u5c04\u5173\u7cfb\u3002\u5bf9\u8c61\u7f16\u7801\u652f\u6301Jason\u3001proto-buffer\u3001text\u7b49\uff0c\u901a\u8fc7Content-Type\u8fdb\u884c\u533a\u5206\u3002\u901a\u4fe1\u534f\u8bae\u91c7\u7528HTTP\u534f\u8bae\u65cf\uff0c\u6bd4\u5982HTTP\u3001HTTPS\u3001HTTP2\uff08H2\u548cH2C\uff09\u3002 </li> <li>Highway\uff1a \u5bf9\u8c61\u7f16\u7801\u652f\u6301proto-buffer\u3002\u901a\u4fe1\u534f\u8bae\u91c7\u7528Java Chassis\u81ea\u5b9a\u4e49\u7684\u79c1\u6709TCP\u534f\u8bae\u3002 </li> </ul> <p>Java Chassis\u7684\u7f16\u7a0b\u6a21\u578b\u548c\u901a\u4fe1\u6a21\u578b\u5206\u79bb\uff0c\u610f\u5473\u7740\u4e1a\u52a1\u4ee3\u7801\u5f00\u53d1\u7684\u65f6\u5019\uff0c\u4e0d\u9700\u8981\u5173\u6ce8\u901a\u4fe1\u6a21\u578b\uff0c\u53ef\u4ee5\u5728\u4e0d\u4fee\u6539\u4e1a\u52a1\u4ee3\u7801\u7684\u60c5\u51b5\u4e0b\uff0c \u4fee\u6539\u901a\u4fe1\u6a21\u578b\u914d\u7f6e\uff0c\u5207\u6362\u4e3a\u65b0\u7684\u901a\u4fe1\u6a21\u578b\u3002 </p>"},{"location":"transports/introduction.html#_2","title":"\u5982\u4f55\u9009\u62e9\u534f\u8bae","text":"<p>\u5728\u591a\u6570\u573a\u666f\uff0c\u5efa\u8bae\u4f7f\u7528REST\u534f\u8bae\uff0c\u7f16\u7801\u4f7f\u7528Json\u3002 Java Chassis\u5bf9REST\u534f\u8bae\u8fdb\u884c\u4e86\u5f88\u597d\u7684\u4f18\u5316\uff0c\u80fd\u591f\u6ee1\u8db3\u7edd\u5927\u591a\u6570\u5e94\u7528\u573a\u666f\u7684\u9700\u8981\u3002REST\u534f\u8bae\u548cJson\u7f16\u7801\u5177\u5907\u66f4\u597d\u7684\u8de8\u5e73\u53f0\u7279\u6027\uff0c\u80fd\u591f\u652f\u6301\u4e0d\u540c\u7cfb\u7edf\u76f4\u63a5\u5bf9\u63a5\uff0cHTTP\u534f\u8bae\u5728\u5e94\u5bf9\u5927\u89c4\u6a21\u5e76\u53d1\u573a\u666f\uff0c\u63d0\u4f9b\u4e86\u975e\u5e38\u597d\u7684\u5065\u58ee\u6027\u3002\u5728\u517c\u5bb9\u6027\u65b9\u9762\uff0cREST\u534f\u8bae\u548cJson\u7f16\u7801\u80fd\u591f\u66f4\u597d\u7684\u652f\u6301\u4e1a\u52a1\u5e73\u6ed1\u5347\u7ea7\uff0c\u5f53\u4e1a\u52a1\u63a5\u53e3\u5b58\u5728\u53d8\u5316\uff08\u63a5\u53e3\u53c2\u6570\u4e2a\u6570\u3001\u53c2\u6570\u987a\u5e8f\u3001Model\u589e\u51cf\u5b57\u6bb5\u7b49\u573a\u666f\uff09\u7684\u5927\u90e8\u5206\u5e38\u89c1\u60c5\u51b5\uff0c\u5ba2\u6237\u7aef\u672a\u5347\u7ea7\u80fd\u591f\u6210\u529f\u8c03\u7528\u670d\u52a1\u7aef\uff0c\u8fd9\u6837\u7ed9\u670d\u52a1\u7aef\u548c\u5ba2\u6237\u7aef\u72ec\u7acb\u5347\u7ea7\u5e26\u6765\u5f88\u591a\u65b9\u4fbf\u3002</p> <p>\u91c7\u7528proto-buffer\u7f16\u7801\uff0c\u5e8f\u5217\u5316\u66f4\u5feb\uff0c\u6570\u636e\u91cf\u66f4\u5c0f\uff0c\u80fd\u591f\u63d0\u4f9b\u66f4\u9ad8\u7684\u541e\u5410\u91cf\u3002 \u4f46\u662fproto-buffer\u4e1a\u52a1\u63a5\u53e3\u5b58\u5728\u53d8\u5316\u7684\u60c5\u51b5\uff0c\u5982\u679c\u5ba2\u6237\u7aef\u672a\u5347\u7ea7\uff0c\u670d\u52a1\u7aef\u5148\u5347\u7ea7\uff0c\u53ef\u80fd\u5bfc\u81f4\u5ba2\u6237\u7aef\u8c03\u7528\u5931\u8d25\u3002\u5728\u5ba2\u6237\u7aef\u4f7f\u7528\u7684\u63a5\u53e3\u548c\u670d\u52a1\u7aef\u4e0d\u5b58\u5728\u7f16\u8bd1\u65f6\u4f9d\u8d56\u7684\u573a\u666f\u4e0b\uff0c\u8fd9\u79cd\u95ee\u9898\u4f1a\u96be\u4e8e\u53d1\u73b0\u3002</p> <p>\u91c7\u7528Highway\u534f\u8bae\uff0c\u5728\u6d89\u53ca\u7cfb\u7edf\u96c6\u6210\u7684\u65f6\u5019\uff0c\u4f1a\u78b0\u5230\u9ebb\u70e6\u3002</p> <p>\u603b\u7ed3\u8d77\u6765\uff0c\u591a\u6570\u60c5\u51b5\u5efa\u8bae\u4f7f\u7528REST\u534f\u8bae\u3002\u5728\u5c11\u91cf\u9700\u8981\u9ad8\u6027\u80fd\u3001\u5e76\u4e14\u529f\u80fd\u76f8\u5bf9\u7a33\u5b9a\uff0c\u4e0d\u600e\u4e48\u53d8\u5316\u7684\u573a\u666f\uff0c\u4f7f\u7528proto-buffer\u6216\u8005\u4f7f\u7528Highway\u534f\u8bae\u63d0\u5347\u7cfb\u7edf\u541e\u5410\u91cf\u548c\u964d\u4f4e\u65f6\u5ef6\u3002 </p>"},{"location":"transports/rest-over-servlet-embedded.html","title":"REST over Servlet(Spring Boot Embedded)","text":""},{"location":"transports/rest-over-servlet-embedded.html#_1","title":"\u5f00\u53d1\u4ecb\u7ecd","text":"<p>\u53c2\u8003 Spring Boot\u96c6\u6210Java Chassis\u4ecb\u7ecd \uff0cWeb\u5f00\u53d1\u6a21\u5f0f\u4f7f\u7528 REST over Servlet(Spring Boot Embedded)\u3002</p> <p>REST over Servlet\u7684\u672c\u8d28\u662f\u5c06Java Chassis\u4f5c\u4e3a\u4e00\u4e2aServlet\uff0c\u90e8\u7f72\u5230\u652f\u6301Servlet\u7684Web\u5bb9\u5668\u4e2d\u3002 </p>"},{"location":"transports/rest-over-servlet-embedded.html#_2","title":"\u914d\u7f6e\u53c2\u8003","text":"<p>\u4f7f\u7528Spring Boot Embedded\u573a\u666f\uff0c\u76f8\u5173Web\u5bb9\u5668\u53c2\u6570\u9700\u8981\u7ed3\u5408Spring Boot\u914d\u7f6e\uff0c\u8fd9\u91cc\u4e0d\u8be6\u7ec6\u4ecb\u7ecd\u3002 \u53ea\u7ed9\u51faJava Chassis\u589e\u52a0\u7684\u914d\u7f6e\u3002 </p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 servicecomb.rest.address 0.0.0.0:8080 \u670d\u52a1\u76d1\u542c\u5730\u5740\u5fc5\u987b\u914d\u7f6e\u4e3a\u4e0eweb\u5bb9\u5668\u76d1\u542c\u5730\u5740\u76f8\u540c\u7684\u5730\u5740 servicecomb.rest.server.timeout -1 \u5f02\u6b65servlet\u8d85\u65f6\u65f6\u95f4, \u5355\u4f4d\u4e3a\u6beb\u79d2\u5efa\u8bae\u4fdd\u6301\u9ed8\u8ba4\u503c servicecomb.Provider.requestWaitInPoolTimeout${op-priority} 30000 \u5728\u540c\u6b65\u7ebf\u7a0b\u4e2d\u6392\u961f\u7b49\u5f85\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2 servicecomb.rest.server.requestWaitInPoolTimeout 30000 \u540cservicecomb.Provider.requestWaitInPoolTimeout${op-priority}, \u8be5\u914d\u7f6e\u9879\u4f18\u5148\u7ea7\u66f4\u9ad8\u3002"},{"location":"transports/rest-over-servlet.html","title":"REST over Servlet(WAR)","text":"<p>\u548c REST over Servlet(Spring Boot Embedded) \u7c7b\u4f3c\uff0c\u53ef\u4ee5\u5c06Spring Boot\u5e94\u7528\u6253\u5305\u4e3a WAR\uff0c\u7136\u540e\u653e\u5230\u72ec\u7acb\u5b89\u88c5\u7684 Tomcat \u5bb9\u5668\u8fd0\u884c\u3002 \u5b83\u4eec\u7684\u5de5\u4f5c\u673a\u5236\u4e00\u6837\uff0c\u53ea\u662f\u5728Spring Boot\u5e94\u7528\u914d\u7f6e\u65b9\u9762\u6709\u4e9b\u5dee\u5f02\u3002 </p> <p>WAR\u76f8\u5173Web\u5bb9\u5668\u53c2\u6570\u9700\u8981\u7ed3\u5408Tomcat\u914d\u7f6e\uff0c\u8fd9\u91cc\u4e0d\u8be6\u7ec6\u4ecb\u7ecd\u3002 Java Chassis\u914d\u7f6e\u53c2\u6570\u548cEmbedded\u4e00\u6837\u3002</p> <p>basic-tomcat \u63d0\u4f9b\u4e86\u5f00\u53d1\u4f8b\u5b50\u3002 </p>"},{"location":"transports/rest-over-servlet.html#springbootservletinitializer","title":"\u4f7f\u7528 SpringBootServletInitializer","text":"<p>Spring Boot\u542f\u52a8\u7c7b\u9700\u8981\u7ee7\u627f SpringBootServletInitializer, \u5e76\u4e14\u8bbe\u7f6e WebApplicationType.SERVLET\u3002</p> <pre><code>@SpringBootApplication\npublic class ProviderApplication extends SpringBootServletInitializer {\n public static void main(String[] args) throws Exception {\n try {\n new SpringApplicationBuilder()\n .web(WebApplicationType.SERVLET)\n .sources(ProviderApplication.class)\n .run(args);\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}\n</code></pre>"},{"location":"transports/rest-over-servlet.html#_1","title":"\u914d\u7f6e\u6587\u4ef6\u7aef\u53e3","text":"<p>REST\u534f\u8bae\u76d1\u542c\u7aef\u53e3\u9700\u8981\u4fdd\u6301\u548cTomcat\u7aef\u53e3\u4e00\u81f4\u3002 </p> <pre><code>servicecomb:\n # port should same as tomcat\n rest:\n address: 0.0.0.0:8080\n</code></pre>"},{"location":"transports/rest-over-servlet.html#_2","title":"\u4f9d\u8d56","text":"<p>\u9700\u8981\u5728\u4f9d\u8d56\u4e2d\u6dfb\u52a0\uff1a</p> <pre><code>&lt;dependency&gt;\n &lt;groupId&gt;org.apache.servicecomb&lt;/groupId&gt;\n &lt;artifactId&gt;java-chassis-spring-boot-starter-servlet&lt;/artifactId&gt;\n &lt;exclusions&gt;\n &lt;exclusion&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-logging&lt;/artifactId&gt;\n &lt;/exclusion&gt;\n &lt;/exclusions&gt;\n&lt;/dependency&gt;\n&lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt;\n &lt;scope&gt;provided&lt;/scope&gt;\n&lt;/dependency&gt;\n</code></pre>"},{"location":"transports/rest-over-servlet.html#edge-service","title":"\u5fae\u670d\u52a1\u7f51\u5173 Edge Service","text":"<p>\u5fae\u670d\u52a1\u7f51\u5173Edge Service\u4e0d\u652f\u6301Servlet\u534f\u8bae\uff0c\u4e0d\u5efa\u8bae\u5c06\u5176\u90e8\u7f72\u5230Tomcat\u3002\u4ecd\u7136\u4f7f\u7528\u53ef\u6267\u884c jar \u5305\u90e8\u7f72\u3002 </p>"},{"location":"transports/rest-over-vertx.html","title":"REST over HTTP\uff08Vert.x)","text":""},{"location":"transports/rest-over-vertx.html#_1","title":"\u5f00\u53d1\u4ecb\u7ecd","text":"<p>\u53c2\u8003 Spring Boot\u96c6\u6210Java Chassis\u4ecb\u7ecd \uff0c\u9ad8\u6027\u80fd\u6a21\u5f0f\u4f7f\u7528 REST over HTTP\uff08Vert.x\uff09\u3002 </p> <p>application.yaml \u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u793a\u4f8b\uff1a</p> <pre><code>servicecomb:\n rest:\n address: 0.0.0.0:8080\n server:\n verticle-count: 8\n</code></pre> <p>\u5176\u4e2d <code>0.0.0.0:8080</code> \u4ee3\u8868\u4f7f\u7528HTTP\u534f\u8bae\uff0c\u5e76\u4e14\u76d1\u542c8080\u7aef\u53e3\u3002\u53ef\u4ee5\u901a\u8fc7\u5728\u5730\u5740\u540e\u9762\u8ffd\u52a0<code>sslEnabled=true</code>\u4f7f\u7528HTTPS\u901a\u4fe1\uff0c\u5177\u4f53\u4ecb\u7ecd\u89c1\u4f7f\u7528TLS\u901a\u4fe1\u7ae0\u8282\u3002</p>"},{"location":"transports/rest-over-vertx.html#_2","title":"\u914d\u7f6e\u53c2\u8003","text":"<p>REST over HTTP\uff08Vert.x)\u6709\u4ee5\u4e0b\u914d\u7f6e\u9879\uff1a</p> \u914d\u7f6e\u9879 \u9ed8\u8ba4\u503c \u542b\u4e49 servicecomb.rest.address \u670d\u52a1\u76d1\u542c\u5730\u5740\uff0c\u4e0d\u914d\u7f6e\u8868\u793a\u4e0d\u76d1\u542c servicecomb.rest.server.thread-count verticle-count rest server verticle\u5b9e\u4f8b\u6570\uff08Deprecated\uff09 servicecomb.rest.server.verticle-count verticle-count rest server verticle\u5b9e\u4f8b\u6570 servicecomb.rest.server.connection-limit Integer.MAX_VALUE \u5141\u8bb8\u5ba2\u6237\u7aef\u6700\u5927\u8fde\u63a5\u6570 servicecomb.rest.server.connection.idleTimeoutInSeconds 60 \u670d\u52a1\u7aef\u8fde\u63a5\u95f2\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u8d85\u65f6\u8fde\u63a5\u4f1a\u88ab\u91ca\u653e servicecomb.rest.server.compression false \u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u542f\u7528\u538b\u7f29 servicecomb.rest.server.maxInitialLineLength 4096 \u670d\u52a1\u7aef\u63a5\u6536\u8bf7\u6c42\u7684\u6700\u5927 initial line \u957f\u5ea6\uff0c\u5355\u4f4d\u5b57\u8282 servicecomb.rest.server.maxHeaderSize 32768 \u670d\u52a1\u7aef\u63a5\u6536\u8bf7\u6c42\u7684\u6700\u5927header\u957f\u5ea6\uff0c\u5355\u4f4d\u5b57\u8282 servicecomb.rest.server.maxFormAttributeSize 8192 \u670d\u52a1\u7aef\u63a5\u6536\u8bf7\u6c42\u7684\u6700\u5927 form \u957f\u5ea6\uff0c\u5355\u4f4d\u4e3a\u5b57\u8282 servicecomb.rest.server.compressionLevel 6 \u670d\u52a1\u7aefgzip/deflate\u538b\u7f29\u7ea7\u522b servicecomb.rest.server.maxChunkSize 8192 \u6700\u5927http chunk\u5927\u5c0f\uff0c\u5355\u4f4d\u4e3a\u5b57\u8282 servicecomb.rest.server.decoderInitialBufferSize 128 HttpObjectDecoder\u7684\u6700\u5927\u521d\u59cb\u7f13\u51b2\u533a\u5927\u5c0f servicecomb.rest.server.http2ConnectionWindowSize -1 \u5141\u8bb8HTTP/2\u8fde\u63a5\u6570\u5927\u5c0f\uff0c\u65e0\u9650\u5236 servicecomb.rest.server.decompressionSupported false \u662f\u5426\u652f\u6301\u89e3\u538b\u7f29 servicecomb.Provider.requestWaitInPoolTimeout${op-priority} 30000 \u5728\u540c\u6b65\u7ebf\u7a0b\u4e2d\u6392\u961f\u7b49\u5f85\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2 servicecomb.rest.server.requestWaitInPoolTimeout 30000 \u540cservicecomb.Provider.requestWaitInPoolTimeout${op-priority}, \u8be5\u914d\u7f6e\u9879\u4f18\u5148\u7ea7\u66f4\u9ad8\u3002 servicecomb.uploads.maxSize \u65e0\u9650\u5236 \u6700\u5927 body \u5927\u5c0f\uff0c\u8fd9\u4e2a\u914d\u7f6e\u9879\u5bf9\u6587\u4ef6\u4e0a\u4f20\uff0cREST\u8bf7\u6c42\u90fd\u751f\u6548"},{"location":"transports/rest-over-vertx.html#_3","title":"\u8865\u5145\u8bf4\u660e","text":"<ul> <li>\u6781\u9650\u8fde\u63a5\u6570\u8ba1\u7b97 </li> </ul> <p>\u5047\u8bbe\u5728\u5fae\u670d\u52a1A\u8c03\u7528B\u7684\u60c5\u51b5\u4e0b\uff0c\u5fae\u670d\u52a1A\u548cB\u5404\u670910\u4e2a\u5b9e\u4f8b\uff0c\u5fae\u670d\u52a1A\u7684\u914d\u7f6e\u4e3a\uff1a</p> <ul> <li>servicecomb.rest.client.verticle-count\u914d\u7f6e\u4e3a8</li> <li>servicecomb.rest.client.connection.maxPoolSize\u914d\u7f6e\u4e3a5</li> <li>\u5fae\u670d\u52a1B\u670910\u4e2a\u5b9e\u4f8b </li> </ul> <p>\u7ad9\u5728A\u7684\u89d2\u5ea6\uff0c\u5728\u6781\u9650\u60c5\u51b5\u4e0b\uff1a * \u4e00\u4e2a\u5b9e\u4f8b\u6700\u591a\u4f1a\u5efa\u7acb400\u6761\u8fde\u63a5\u3002\uff08<code>8 * 5 * 10 = 400</code>\uff09 * \u5047\u8bbe\u8be5A\u8fd8\u9700\u8981\u8c03\u7528\u5fae\u670d\u52a1C\uff0c\u5fae\u670d\u52a1C\u4e5f\u670910\u4e2a\u5b9e\u4f8b\uff0c\u5219\u6700\u591a\u518d\u5efa\u7acb400\u6761\u8fde\u63a5\uff0c\u5171800\u6761\u8fde\u63a5</p> <p>\u7ad9\u5728B\u7684\u89d2\u5ea6\uff0c\u5728\u6781\u9650\u60c5\u51b5\u4e0b\uff1a * \u4e00\u4e2aA\u7684\u5b9e\u4f8b\u6700\u591a\u5efa\u7acb40\u6761\u8fde\u63a5\u3002(<code>8 * 5 = 40</code>) * 10\u4e2aA\u7684\u5b9e\u4f8b\u6700\u591a\u4f1a\u5411\u4e00\u4e2aB\u5efa\u7acb<code>40 * 10 = 400</code>\u6761\u8fde\u63a5</p> <p>\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u9700\u8981\u5c3d\u91cf\u4f7f\u7528\u66f4\u5927\u7684\u8fde\u63a5\u6c60\uff0c\u4f46\u662f\u66f4\u5927\u7684\u8fde\u63a5\u6c60\u53c8\u53ef\u80fd\u4f1a\u5bfc\u81f4\u8fde\u63a5\u6570\u66b4\u6da8\uff0c\u5f53\u5fae\u670d\u52a1\u5b9e\u4f8b\u89c4\u6a21\u8fbe\u5230\u767e\u7ea7\u522b\u65f6\uff0c\u6709\u7684\u8fdb\u7a0b\u53ef\u80fd\u9700\u8981\u7ba1\u7406 \u51e0\u4e07\u6761\u8fde\u63a5\uff0c\u4e1a\u52a1\u9700\u8981\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u89c4\u6a21\u8fdb\u884c\u5408\u7406\u7684\u89c4\u5212\u3002\u5728\u5b9e\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0cHTTP\u4ecd\u7136\u662f\u6240\u6709\u5e94\u7528\u7a0b\u5e8f\u7684\u6700\u4f73\u9009\u62e9\uff0c\u5b83\u5177\u5907\u66f4\u597d\u7684\u517c\u5bb9\u6027 \u548c\u53ef\u9760\u6027\u3002\u5f53\u5355\u4e2a\u5b9e\u4f8b\u7684\u8fde\u63a5\u6570\u7ba1\u7406\u89c4\u6a21\u8d85\u8fc71\u4e07\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u8003\u8651\u5207\u6362\u4e3ahttp2\u3002</p>"},{"location":"transports/verticle-count.html","title":"verticle-count","text":""},{"location":"transports/verticle-count.html#_1","title":"\u540d\u79f0\u53ca\u9ed8\u8ba4\u503c","text":"<ul> <li>1.2.0\u4e4b\u524d\u7684\u7248\u672c </li> </ul> <p>\u547d\u540d\u4e3athread-count\uff0c\u4e14\u9ed8\u8ba4\u503c\u4e3a1\uff0c\u8fd9\u5b58\u5728\u4ee5\u4e0b\u95ee\u9898\uff1a </p> <ul> <li>\u540d\u5b57\u6709\u6b67\u4e49\u3002ServiceComb\u5e95\u5c42\u57fa\u4e8evertx\uff0c\u901a\u4fe1\u5c42\u903b\u8f91\u5747\u7531verticle\u627f\u8f7d\uff0c\u8fd0\u884c\u4e8eeventloop\u7ebf\u7a0b\u4e2d\uff0c\u5e76\u4e0d\u4f1a\u518d\u521b\u5efa\u72ec\u7acb\u7684\u7ebf\u7a0b\uff0c \u6240\u4ee5thread-count\u5b9e\u9645\u8868\u793a\u7684\u662f\u521b\u5efa\u7684verticle\u5b9e\u4f8b\u7684\u4e2a\u6570\uff0c\u5e76\u4e0d\u662f\u7ebf\u7a0b\u6570\u3002</li> <li> <p>\u9ed8\u8ba4\u503c\u504f\u5c0f\u3002\u65e7\u7248\u672c\u9009\u62e9\u4e86\u6700\u4fdd\u5b88\u7684\u9ed8\u8ba4\u503c\uff0c\u5bfc\u81f4\u5927\u90e8\u5206\u573a\u666f\u90fd\u9700\u8981\u505a\u8fd9\u4e2a\u53c2\u6570\u7684\u8c03\u6574\u3002</p> </li> <li> <p>1.2.0\u53ca\u5176\u4e4b\u540e\u7684\u7248\u672c </p> </li> </ul> <p>\u91cd\u547d\u540d\u4e3averticle-count\u3002\u540c\u65f6\u5141\u8bb8\u65e7\u7684thread-count\uff0c\u4f46\u662f\u4f1a\u6253\u5370warning\u65e5\u5fd7\uff0c\u63d0\u9192\u5207\u6362\u4e3a\u65b0\u914d\u7f6e\u9879\u3002 \u9ed8\u8ba4\u503c\u89c4\u5219\uff1a </p> <ul> <li>\u5982\u679cCPU\u6570\u5c0f\u4e8e8\uff0c\u5219\u53d6CPU\u6570</li> <li>\u5982\u679cCPU\u6570\u5927\u4e8e\u7b49\u4e8e8\uff0c\u5219\u4e3a8</li> </ul>"},{"location":"transports/verticle-count.html#eventloopverticle","title":"Eventloop\u4e0everticle\u5b9e\u4f8b\u7684\u5173\u7cfb\uff1a","text":"<p>\u5047\u8bbeCPU\u4e3a2\uff0c\u5219vertx\u9ed8\u8ba4\u521b\u5efa 2 * CPU\uff0c \u53734\u4e2aEventloop\u7ebf\u7a0b \u5047\u8bbe\u914d\u7f6eserver verticle count\u548cclient verticle count\u5747\u4e3a3\uff0c\u5219\u4ed6\u4eec\u7684\u5173\u7cfb\u5982\u4e0b\uff1a</p> <p> </p> <p>\u56e0\u4e3a\u5728Eventloop\u4e2d\u4e0d\u5141\u8bb8\u6267\u884c\u4efb\u4f55\u963b\u585e\u52a8\u4f5c\uff0c\u518d\u7ed3\u5408\u4e0a\u56fe\uff0c\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\uff0c\u5f53\u5145\u5206\u5229\u7528\u4e86CPU\u4e4b\u540e\uff0c\u518d\u589e\u52a0verticle\u5b9e\u4f8b\u662f\u6ca1\u6709\u610f\u4e49\u7684\uff0c \u6240\u4ee51.2.0\u4e4b\u540e\u7684\u7248\u672c\u7684\u7f3a\u7701\u503c\u5bf9\u4e8e\u591a\u6570\u60c5\u51b5\u662f\u6700\u4f18\u7684\u914d\u7f6e\u3002</p>"}]}