Devide FAQ to independent module, and add faqs Signed-off-by: Zen Lin <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/commit/455450a0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/tree/455450a0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/diff/455450a0 Branch: refs/heads/asf-site Commit: 455450a0ff08dedc8ee5b6f69b05233171265053 Parents: b76908d Author: Zen Lin <[email protected]> Authored: Sun Oct 29 19:40:03 2017 +0800 Committer: Eric Lee <[email protected]> Committed: Sun Oct 29 21:42:32 2017 +0800 ---------------------------------------------------------------------- _config.yml | 13 ++ _data/navigation.yml | 30 +-- _data/ui-text.yml | 2 + _faqs/cn/faq.md | 424 +++++++++++++++++++++++++++++++++++++ _faqs/cn/huawei-cloud-faq.md | 41 ++++ _faqs/faq.md | 59 ++++++ _faqs/huawei-cloud-faq.md | 41 ++++ _users/cn/faq.md | 415 ------------------------------------ _users/cn/huawei-cloud-faq.md | 41 ---- 9 files changed, 596 insertions(+), 470 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_config.yml ---------------------------------------------------------------------- diff --git a/_config.yml b/_config.yml index 4a8c4e3..6a25b62 100644 --- a/_config.yml +++ b/_config.yml @@ -117,6 +117,7 @@ include: - _developers - _docs - _users + - _faqs exclude: - "*.sublime-project" - "*.sublime-workspace" @@ -237,6 +238,18 @@ defaults: comments: false sidebar: nav: "docs" + # _faqs + - scope: + path: "_faqs" + type: pages + values: + layout: single + read_time: false + author_profile: false + share: false + comments: false + sidebar: + nav: "faqs" # Sass/SCSS sass: http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_data/navigation.yml ---------------------------------------------------------------------- diff --git a/_data/navigation.yml b/_data/navigation.yml index 54d7fd1..97fce9f 100755 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -10,6 +10,8 @@ t: url: /developers/ - title: "Blogs" url: /year-archive/ + - title: "FAQ" + url: /faqs/ docs: - title: "Quick Start" @@ -37,8 +39,6 @@ t: url: /users/ - title: Setup Environment url: /users/setup-environment/ - - title: FAQ - url: /users/faq/ - title: Develop Service Provider children: @@ -102,11 +102,6 @@ t: - title: Use TLS url: /users/use-tls/ - - title: Huawei Public Cloud - children: - - title: FAQ - url: /users/huawei-cloud-faq/ - developers: - title: "Developer Guide" url: /developers/ @@ -115,6 +110,12 @@ t: - title: "Code Submit Guide" url: /developers/submit-codes/ + faqs: + - title: "FAQ" + url: /faqs/ + - title: "FAQ of Huawei Cloud" + url: /faqs/faqs-huawei-cloud/ + cn: main: - title: "å¿«éå ¥é¨" @@ -125,6 +126,8 @@ t: url: /cn/developers/ - title: "åæ" url: /cn/year-archive/ + - title: "常è§é®é¢" + url: /cn/faqs/ docs: - title: "å¿«éå ¥é¨" @@ -152,8 +155,6 @@ t: url: /cn/users/ - title: ç¯å¢é ç½® url: /cn/users/setup-environment/ - - title: 常è§é®é¢ - url: /cn/users/faq/ - title: å¼åæå¡æä¾è children: @@ -217,11 +218,6 @@ t: - title: 使ç¨TLSéä¿¡ url: /cn/users/use-tls/ - - title: åä¸ºå ¬æäº - children: - - title: 常è§é®é¢ - url: /cn/users/huawei-cloud-faq/ - developers: - title: "å¼åè æå" url: /cn/developers/ @@ -229,3 +225,9 @@ t: url: /cn/developers/setup-develop-environment/ - title: "ä»£ç æäº¤æå" url: /cn/developers/submit-codes/ + + faqs: + - title: "常è§é®é¢" + url: /cn/faqs/ + - title: "åä¸ºå ¬æäºå¸¸è§é®é¢" + url: /cn/faqs/faqs-huawei-cloud/ http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_data/ui-text.yml ---------------------------------------------------------------------- diff --git a/_data/ui-text.yml b/_data/ui-text.yml index f8b7018..64af9bb 100644 --- a/_data/ui-text.yml +++ b/_data/ui-text.yml @@ -7,6 +7,7 @@ en: &DEFAULT_EN quick_start : "Quick Start" user_guide : "User Guide" blogs : "Blogs" + faqs : "FAQ" faq : "Common Questions" contribute : "Contribute" report_issue : "Report a Doc Issue" @@ -367,6 +368,7 @@ zh: &DEFAULT_ZH quick_start : "å¿«éå ¥é¨" user_guide : "ç¨æ·æå" blogs : "å客" + faqs : "常è§é®é¢" faq : "常è§é®é¢" contribute : "è´¡ç®" report_issue : "æ¥åæ¬ç½é¡µé®é¢" http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_faqs/cn/faq.md ---------------------------------------------------------------------- diff --git a/_faqs/cn/faq.md b/_faqs/cn/faq.md new file mode 100644 index 0000000..fc50549 --- /dev/null +++ b/_faqs/cn/faq.md @@ -0,0 +1,424 @@ +--- +title: "常è§é®é¢" +lang: cn +ref: faq +permalink: /cn/faqs/ +excerpt: "常è§é®é¢" +last_modified_at: 2017-10-29T15:01:43-04:00 +redirect_from: + - /theme-setup/ +--- + +* **Q: ServiceCombåSpringCloudæ¯ä»ä¹å ³ç³»ï¼å ·ä½çåºç¨åºæ¯æ¯ä»ä¹ï¼** + + A: ServiceCombæ¯å为åºäºå é¨å¤ä¸ªå¤§åITç³»ç»å®è·µæç¼åºæ¥çä¸å¥å¾®æå¡å¼åæ¡æ¶ï¼å¨å¼åæåºäºæä½³å®è·µå°è£ äºä¸å¥å¾®æå¡è¿è¡æ¨¡åï¼è¿äºè½åå¯¹ç¨æ·å®å ¨éæï¼å¯ä»¥éè¿é ç½®å¼å ¥åè½åå¯¹å ¶è¿è¡è°æ´ãå¨è¿ç»´é¶æ®µå åèèäºå¾®æå¡è¿ç»´ï¼æä¾äºä¸°å¯ççæ§ææ åå¨ææ²»çè½åã + B: ServiceCombçè¿å¥è½åå¯ä»¥ä½ä¸ºä¸ä¸ªåç¬çå¼åæ¡æ¶ï¼å¨éè¦è½»é级微æå¡è§£å³æ¹æ¡ççåºæ¯ä¸åç¬ä½¿ç¨ï¼ä¹å¯ä»¥å»ºç«å¨SpringCloudä¸ï¼ä¸SpringCloudæä¾çå ¶ä»ç»ä»¶ä¸èµ·å·¥ä½ï¼å¨ééçº§åºæ¯ä¸åSpringCloudä¸èµ·äº§ç â1+1大äº2âçææã + +* **Q: ç¨IntelliJçå è´¹çå¼åï¼æä»ä¹é®é¢ï¼** + + A: 没æé®é¢ï¼ä½¿ç¨IntelliJ å¼åï¼å¯åè [Setup Developer Environment](/cn/developers/setup-develop-environment/) è¿è¡ç¸åºçç¯å¢é ç½®ã + +* **Q: 使ç¨Java-Chassisè¿ä¸ªæ¡æ¶æ¶æä»ä¹éè¦æ³¨æçå°æ¹ï¼** + + A: 使ç¨Java-Chassisæä»¥ä¸è¿äºéå¶ï¼ + (1) 0.3.0-SNAPSHOTä¹åççæ¬ä¸æ¯æç±»ä¼¼`@GetMapping`è¿æ ·çæ æ³¨ã + (2) æç¨å°çHTTPè¯·æ±æ¹æ³ä¸æ ·æ¶ï¼å¦GETï¼åæ¹æ³åä¸è½éè½½ãè¿æ¯ç±äºçæå¥çº¦æ¶æ¹æ³åä¼ä½ä¸ºå ¶Operation IDï¼æä»¥è¦ä¿è¯å ¶å¯ä¸æ§ã + (3) æ¹æ³åç±»å¿ é¡»æ¯publicçã + +* **Q: 使ç¨*spring-boot-starter-provider*è¿ä¸ªä¾èµæ¶ï¼å¨*application.yml*æä»¶ä¸å£°æç`spring.main.web-application`屿§å¹¶æ²¡æçæï¼** + + A: 使ç¨*starter-provider*è¿ä¸ªä¾èµæ¶ï¼å¦æç¨å°äºservletè¿ç§æ¹å¼æ¶ï¼éè¦å¨*application.properties*è¿ä¸ªæä»¶å¼å ¥`spring.main.web-application=true`è¿æ ·ç屿§æè å¨*application.yml*æä»¶ä¸å£°æï¼ä½æ¯æ¤æ¶éè¦æ°å»ºä¸ä¸ª*application.properties*çæä»¶ï¼å ¶å 容å¯ä»¥ä¸ºç©ºã + +* **Q: ç½å ³ä¾èµçjaråå ¶ä»å¾®æå¡ç䏿 ·åï¼** + + ```xml + <groupId>io.servicecomb</groupId> + <artifactId>spring-boot-starter-provider</artifactId> + ``` + + A: ç½å ³é¤äºè¦ä¾èµ`spring-boot-starter-provider`ä¹å¤è¿è¦ä¾èµ`spring-boot-starter-discovery`ï¼å¯ä»¥åè[LinuxCon-Beijing-Workshop](https://github.com/ServiceComb/LinuxCon-Beijing-WorkShop)ä¸managerçå®ç°ã + +* **Q: ç½å ³éè¦åå ¶ä»å¾®æå¡ä¸æ ·é ç½®assemblyåï¼å ¶ä¸ç/maven/gatewayè¿ä¸ªè·¯å¾æ¯docker maven pluginé»è®¤çåï¼** + + A: éè¦ï¼ç±äºé¡¹ç®ç°å¨ä½¿ç¨çæ¯spring-bootçæå æ¹å¼ï¼docker maven plugin乿¯ä¾èµæå çæçæä»¶æ¥çædockeréåçã/mavenè¿ä¸ªè·¯å¾æ¯docker maven pluginæå®çï¼ègatewayè¿ä¸ªè·¯å¾æ¯å¨assembly䏿å®çã + +* **Q: æå¡æ¥å£çè¿åç±»åå¯ä»¥æ¯ä»»æç±»ååï¼è¿æ¯å¿ é¡»æ¯responseEntityï¼** + + A: å¯ä»¥ï¼å ·ä½å¯ä»¥åèjava-chassisç[integration-testçå®ç°](https://github.com/ServiceComb/java-chassis/blob/master/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java#L145)ã + +* **Q: å¾®æå¡å¯å¨åï¼æ æ³æ£ç¡®è°ç¨æ¥å£ï¼ä½¿ç¨ç代ç 为ï¼** + + ```java + @RestController + @RestSchema(schemaId = "worker") + public class WorkerController { + @RequestMapping(value="/count", method=RequestMethod.GET) + public int getWorkerNumbers() { + ... + } + } + ``` + + A: 卿²¡ææææ ¹è·¯å¾çæ åµä¸ï¼é»è®¤ä¼ä½¿ç¨ç±»åä½ä¸ºå ¶æ ¹è·¯å¾ï¼å³ä¸è¿°ä»£ç ä¸å¯è®¿é®çè·¯å¾åºä¸º`/WorkerController/count`ã妿æ³è¦å®ç°`/count`è¿æ ·ç访é®ï¼åè¦æææ ¹è·¯å¾ï¼ + + ```java + @RequestMapping(value = "/") + public class WorkerController {} + ``` + +* **Q: å¦ææ²¡ææå®RequestMappingè¿ä¸ªæ 注çvalueæ¶ï¼é»è®¤çåºæ¬è·¯å¾æ¯ä»ä¹ï¼** + + A: åè®¾ä½ çControllerç±»å为*HelloController*ï¼é£ä¹åºæ¬è·¯å¾å°±æ¯/HelloControllerã + +* **Q: å¨eclipseä¸ä¿®æ¹äºmicroservice.yamlé ç½®æä»¶ä¸ç端å£å·ï¼å¯å¨ç¨åºåï¼ç«¯å£å·æ²¡çæï¼** + + A: éè¦åç¬å¯¼å ¥sample项ç®ï¼å¦æå¯¼å ¥æ´ä¸ªServiceComb-Java-Chassis项ç®ï¼ç±äºsampleç®å½ä¸å¨ServiceComb-Java-Chassis模åä¸ï¼IDEä¸ä¼å¯¹sampleè¿è¡ç¼è¯,eclipseä¸å¹¶æ²¡ææç¤ºé误信æ¯ï¼IDEAä¸ä¼ææç¤ºä¿¡æ¯ãå æ¤eclipseå¯å¨sampleçdemoä¼åç°ä¿®æ¹äºç«¯å£æ²¡æçæã + +* **Q: å¦ä½èªå®ä¹æä¸ªJavaæ¹æ³å¯¹åºçRESTæ¥å£éçHTTP Status Codeï¼** + + A: å¯¹äºæ£å¸¸çè¿åå¼ï¼å¯ä»¥éè¿SwaggerAnnotationå®ç°ï¼ä¾å¦ï¼ + + ```java + @ApiResponse(code = 300, response = String.class, message = "") + public int test(int x) { + return 100; + } + ``` + + 对äºå¼å¸¸çè¿åå¼ï¼å¯ä»¥éè¿æåºèªå®ä¹çInvocationExceptionå®ç°ï¼ä¾å¦ï¼ã + + ```java + public String testException(int code) { + String strCode = String.valueOf(code); + switch (code) { + case 200: + return strCode; + case 456: + throw new InvocationException(code, strCode, strCode + " error"); + case 556: + throw new InvocationException(code, strCode, Arrays.asList(strCode + " error")); + case 557: + throw new InvocationException(code, strCode, Arrays.asList(Arrays.asList(strCode + " error"))); + default: + break; + } + + return "not expected"; + } + ``` + + +* **Q: å¦ä½å®å¶èªå·±å¾®æå¡çæ¥å¿é ç½®?** + + A: ServiceCombä¸ç»å®æ¥å¿å¨ï¼åªæ¯ä½¿ç¨äºslf4jï¼ç¨æ·å¯ä»¥èªç±éæ©log4j/log4j2/logbackççãServiceCombæä¾äºä¸ä¸ªlog4jçæ©å±ï¼å¨æ ålog4jçåºç¡ä¸ï¼æ¯ælog4jçpropertiesæä»¶çå¢éé ç½®ã + * é»è®¤ä»¥è§åï¼"classpath\*:config/log4j.properties"å è½½é ç½®æä»¶ + * å®é ä¼æç´¢åºclasspath䏿æç```config/log4j.propertiesåconfig/log4j.*.properties```, ä»æç´¢åºçæä»¶ä¸ååº```\*```çé¨åï¼è¿è¡alphaæåºï¼ç¶åæé¡ºåºå è½½ï¼æååæçæä»¶ä½ä¸ºlog4jçé ç½®æä»¶ã + * 妿è¦ä½¿ç¨ServiceCombçlog4jæ©å±ï¼åéè¦è°ç¨Log4jUtils.initï¼å¦åå®å ¨ææ åçæ¥å¿å¨çè§å使ç¨ã + +* **Q: 彿å¡é ç½®äºå¤ä¸ªtransportçæ¶åï¼å¨è¿è¡æ¶æ¯æä¹éæ©ä½¿ç¨åªä¸ªtransportçï¼** + + A: + * ServiceCombçconsumerãtransportãhandlerãproducerä¹é´æ¯è§£è¦çï¼ååè½ä¹é´éè¿å¥çº¦å®ä¹èåå¨ä¸èµ·å·¥ä½çï¼å³ï¼ + consumer使ç¨éærpcï¼è¿æ¯springmvcå¼åä¸ä½¿ç¨highwayï¼è¿æ¯RESTfulå¨ç½ç»ä¸ä¼ è¾æ²¡æå ³ç³»ä¸produceræ¯ä½¿ç¨éærpcï¼è¿æ¯jaxrsï¼æè æ¯springmvcå¼åï¼ä¹æ²¡æå ³ç³»handlerä¹ä¸æç¥ï¼ä¸å¡å¼åæ¹å¼ä»¥åä¼ è¾æ¹å¼ + + * consumer访é®producerï¼å¨è¿è¡æ¶çtransportéæ©ä¸ï¼æ»è§åä¸ºï¼ + consumerçtransportä¸producerçendpointå交éï¼å¦æäº¤éåï¼è¿æå¤ä¸ªtransportå¯éæ©ï¼åè½®æµä½¿ç¨ + + åè§£å¼æ¥ï¼åå¨ä»¥ä¸åºæ¯ï¼ + + * å½ä¸ä¸ªå¾®æå¡producer忶弿¾äºhighway以åRESTfulçendpoint + * consumerè¿ç¨ä¸åªé¨ç½²äºhighway transport jarï¼ååªä¼è®¿é®producerçhighway endpoint + * consumerè¿ç¨ä¸åªé¨ç½²äºRESTful transport jarï¼ååªä¼è®¿é®producerçRESTful endpoint + * consumerè¿ç¨ä¸ï¼åæ¶é¨ç½²äºhighwayåRESTful transport jarï¼åä¼è½®æµè®¿é®producerçhighwayãRESTful endpoint + + å¦æï¼æ¤æ¶consumeræ³åºå®ä½¿ç¨æä¸ªtransport访é®producerï¼å¯ä»¥å¨consumerè¿ç¨çmicroservice.yamlä¸é ç½®ï¼æå®transportçåç§°: + + ```yaml + servicecomb: + references: + <service_name>: + transport: highway + ``` + + * å½ä¸ä¸ªå¾®æå¡produceråªå¼æ¾äºhighwayçendpoint + * consumerè¿ç¨åªé¨ç½²äºhighway transport jarï¼åæ£å¸¸ä½¿ç¨highwayè®¿é® + * consumerè¿ç¨åªé¨ç½²äºRESTful transport jarï¼åæ æ³è®¿é® + * consumerè¿ç¨åæ¶é¨ç½²äºhighwayåRESTful transport jarï¼åæ£å¸¸ä½¿ç¨highwayè®¿é® + + * å½ä¸ä¸ªå¾®æå¡produceråªå¼æ¾äºRESTfulçendpoint + * consumerè¿ç¨åªé¨ç½²äºhighway transport jarï¼åæ æ³è®¿é® + * consumerè¿ç¨åªé¨ç½²äºRESTful transport jarï¼åæ£å¸¸ä½¿ç¨RESTfulè®¿é® + * consumerè¿ç¨åæ¶é¨ç½²äºhighwayåRESTful transport jarï¼åæ£å¸¸ä½¿ç¨RESTfulè®¿é® + +* **Q: swagger bodyåæ°ç±»åå®ä¹é误ï¼å¯¼è´æå¡ä¸å¿æ³¨åçå 容没æç±»åä¿¡æ¯** + + **ç°è±¡æè¿°:** + + å®ä¹å¦ä¸æ¥å£ï¼å°åæ°æ¾å°bodyä¼ é + + ```yaml + /testInherate: + post: + operationId: "testInherate" + parameters: + - in: "body" + name: "xxxxx" + required: false + type: string + responses: + 200: + description: "response of 200" + schema: + $ref: "#/definitions/ReponseImpl" + ``` + + éç¨ä¸é¢æ¹å¼å®ä¹æ¥å£ã卿塿³¨å以åï¼ä»æå¡ä¸å¿æ¥è¯¢ä¸æ¥çæ¥å£type: string 丢失ï¼åæäºï¼ + + ```yaml + /testInherate: + post: + operationId: "testInherate" + parameters: + - in: "body" + name: "xxxxx" + required: false + responses: + 200: + description: "response of 200" + schema: + $ref: "#/definitions/ReponseImpl" + ``` + + 妿客æ·ç«¯æ²¡ææ¾ç½®swaggerï¼è¿ä¼æ¥åå¦ä¸å¼å¸¸ï¼ + + ```text + Caused by: java.lang.ClassFormatError: Method "testInherate" in class ? has illegal signature " + ``` + + Aï¼å®ä¹bodyåæ°çç±»åçæ¶åï¼éè¦ä½¿ç¨schemaï¼ä¸è½ç´æ¥ä½¿ç¨typeã + + ```yaml + /testInherate: + post: + operationId: "testInherate" + parameters: + - in: "body" + name: "request" + required: false + schema: + type: string + responses: + 200: + description: "response of 200" + schema: + $ref: "#/definitions/ReponseImpl" + ``` + +* **Q: ServiceCombå¾®æå¡æ¡æ¶æå¡è°ç¨æ¯å¦ä½¿ç¨é¿è¿æ¥?** + + A: http使ç¨çæ¯é¿è¿æ¥ï¼æè¶ æ¶æ¶é´ï¼ï¼highwayæ¹å¼ä½¿ç¨çæ¯é¿è¿æ¥ï¼ä¸ç´ä¿æï¼ã + +* **Q: æå¡æè¿æå¡ä¸å¿æ³¨åä¿¡æ¯æ¯å¦èªå¨å é¤** + + A: æå¡ä¸å¿å¿è·³æ£æµå°æå¡å®ä¾ä¸å¯ç¨ï¼åªä¼ç§»é¤æå¡å®ä¾ä¿¡æ¯ï¼æå¡çéææ°æ®ä¸ä¼ç§»é¤ã + +* **Q: å¦æä½¿ç¨tomcatæ¹å¼éæServiceCombå¾®æå¡æ¡æ¶ï¼å¦ä½å®ç°æå¡æ³¨å** + + A: å¦æä½¿ç¨cse sdk servletæ¹å¼ï¼ä½¿ç¨transport-rest-servletä¾èµï¼å¶ä½ä¸ºwarå é¨ç½²å°tomcatï¼éè¦ä¿è¯ï¼æå¡æè¿°æä»¶ï¼microservice.yamlï¼ä¸rest端å£é ç½®åå¤ç½®å®¹å¨ä¸è´æè½å®ç°è¯¥æå¡çæ£ç¡®æ³¨åãå¦åæ æ³æç¥tomcat弿¾ç«¯å£ã + +* **Q: å¦æä½¿ç¨tomcatæ¹å¼éæCSEå¾®æå¡æ¡æ¶ï¼æå¡æ³¨åçæ¶åå¦ä½å°warå é¨ç½²çä¸ä¸ææ³¨åå°æå¡ä¸å¿** + + A: å叿塿¥å£çæ¶åéè¦å°warå é¨ç½²çä¸ä¸æï¼contextï¼æ¾å¨baseurlæåé¢ï¼è¿æ ·æè½ä¿è¯æ³¨åå°æå¡ä¸å¿çè·¯å¾æ¯å®æ´çè·¯å¾ï¼å å«äºä¸ä¸æï¼ãå®ä¾ï¼ + + ```java + @path(/{context}/xxx) + class ServiceA + ``` + +* **Q: ServiceCombå¾®æå¡æ¡æ¶å¦ä½å®ç°æ°æ®å¤ä¸ªå¾®æå¡é´éä¼ ** + + A: + éä¼ æ°æ®å¡å ¥ï¼ + + ```java + CseHttpEntity<xxxx.class> httpEntity = new CseHttpEntity<>(xxx); + //éä¼ å 容 + httpEntity.addContext("contextKey","contextValue"); + ResponseEntity<String> responseEntity = RestTemplateBuilder.create().exchange("cse://springmvc/springmvchello/sayhello",HttpMethod.POST,httpEntity,String.class); + ``` + + éä¼ æ°æ®è·åï¼ + + ```java + @Override + @RequestMapping(path="/sayhello",method = RequestMethod.POST) + public String sayHello(@RequestBody Person person,InvocationContext context){ + //éä¼ æ°æ®è·å + context.getContext(); + return "Hello person " + person.getName(); + } + ``` + +* **Q: ServiceCombå¾®æå¡æ¡æ¶æå¡å¦ä½èªå®ä¹è¿åç¶æç ?** + + A: + ```java + @Override + @RequestMapping(path = "/sayhello",method = RequestMethod.POST) + public String sayHello(@RequestBody Person person){ + InvocationContext context = ContextUtils.getInvocationContext(); + //èªå®ä¹ç¶æç + context.setStatus(Status.CREATED); + return "Hello person "+person.getName(); + } + ``` + +* **Q: ServiceComb body Modelé¨åæ´é²** + + A: ä¸ä¸ªæ¥å£å¯¹åºçbody对象ä¸ï¼å¯è½æä¸äºå±æ§æ¯å é¨çï¼ä¸æ³å¼æ¾åºå»ï¼çæschemaçæ¶åä¸è¦å¸¦åºå»ï¼ä½¿ç¨ï¼ + + ```java + @ApiModelProperty(hidden = true) + ``` + +* **Q: ServiceCombæ¡æ¶è·åè¿ç«¯consumerçå°å** + + A: å¦æä½¿ç¨http restæ¹å¼ï¼ä½¿ç¨transport-rest-vertxä¾èµï¼å¯ä»¥ç¨ä¸é¢è¿ç§æ¹å¼è·åï¼ + + ```java + AbstractProducerContextArgMapper httpRequestCreator = (AbstractProducerContextArgMapper)invocation.getHandlerContext().get(RestConst.HTTP_REQUEST_CREATOR); + if(httpRequestCreator != null){ + HttpServletRequest req = (HttpServletRequest)httpRequestCreator.createContextArg(invocation); + System.out.println(req.getRemoteHost()); + } + ``` + + å®é åºæ¯æ¯æ¿æå¤å±çå°åï¼æä»¥åºè¯¥æ¯LBä¼ å ¥å°edgeserviceï¼edgeServiceåæ¾å°contextå¤ä¸ä¼ éã + +* **Q: ServiceComb䏿¯ææ³å** + + A: æç¡®ä¸æ¯æï¼éè¦ä¿®æ¹æ¥å£ï¼æ¥å£ä¿®æ¹åéè¦ä¿®æ¹çæ¬å·ï¼ä»¥å consumerè¿æ¯ä½¿ç¨æ§ççæ¬ã + +* **Q: ServiceComb对handleræè¿°** + + A: consumeré»è®¤çhandleræ¯simpleLBï¼æ²¡æé ç½®çæ¶åhandleré¾ä¼ä½¿ç¨è¿ä¸ªï¼å¦æé ç½®äºhandlerï¼éé¢ä¸å®è¦å å«lbçhandlerï¼å¦åè°ç¨æ¥éï¼éè¦å¨ææ¡£éé¢è¿è¡è¯´æã + +* **Q: ServiceCombæ¥å¿æ¿æ¢** + + A: CSE java-chassisæ¥å¿æ¨èæ¹å¼æ¯å¨å¯å¨çæ¶å使ç¨Log4jUtils.init\(\)ï¼ç´æ¥ä½¿ç¨æ¨èçLog4jæ¥åæ¥å¿ç®¡çï¼ä½æ¯æäºåºæ¯ä¸æ³ç¨log4jï¼æ¯å¦æ³ä½¿ç¨log4j2æè logbackï¼ä¸é¢ä»¥log4j2为ä¾ç®åä»ç»ä¸æ¥éª¤ï¼ + + 1. å¨ä»£ç éé¢ä¸è¦ä½¿ç¨Log4jUtils.init\(\)ï¼ + 2. 廿log4jçé ç½®æä»¶ï¼ä¸å æä¹æ²¡å ³ç³»ï¼å 为ä¸ä¼ä½¿ç¨ï¼ï¼ + 3. excludeæCSEæ¡æ¶å¼å ¥çlog4jï¼ä¾å¦ï¼ + ```xml + <dependency> + <groupId>io.servicecomb</groupId> + <artifactId>provider-springmvc</artifactId> + <exclusions> + <exclusion> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + </exclusion> + </exclusions> + </dependency> + ``` + 4. å¼å ¥log4j2çä¾èµ + + ```xml + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-slf4j-impl</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + </dependency> + ``` + + å¦ææ²¡æçæ¬ä¾èµç®¡çï¼è¿éè¦å¡«åä¸çæ¬å·ã + + 5. å å ¥log4j2çé ç½®æä»¶log4j2.xmlï¼å ³äºè¿ä¸ªè¯·æ¥ç宿¹è¯´æï¼ä¾å¦ï¼ + + ```xml + <?xml version="1.0" encoding="UTF-8"?> + <!--æ¥å¿çº§å«ä»¥åä¼å 级æåº: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> + <!--Configurationåé¢çstatusï¼è¿ä¸ªç¨äºè®¾ç½®log4j2èªèº«å é¨çä¿¡æ¯è¾åºï¼å¯ä»¥ä¸è®¾ç½®ï¼å½è®¾ç½®ætraceæ¶ï¼ä½ ä¼çå°log4j2å é¨åç§è¯¦ç»è¾åº--> + <!--monitorIntervalï¼Log4jè½å¤èªå¨æ£æµä¿®æ¹é ç½® æä»¶åéæ°é ç½®æ¬èº«ï¼è®¾ç½®é´éç§æ°--> + <configuration status="WARN" monitorInterval="30"> + <!--å å®ä¹ææçappender--> + <appenders> + <!--è¿ä¸ªè¾åºæ§å¶å°çé ç½®--> + <console name="Console" target="SYSTEM_OUT"> + <!--è¾åºæ¥å¿çæ ¼å¼--> + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> + </console> + <!--æä»¶ä¼æå°åºææä¿¡æ¯ï¼è¿ä¸ªlogæ¯æ¬¡è¿è¡ç¨åºä¼èªå¨æ¸ 空ï¼ç±append屿§å³å®ï¼è¿ä¸ªä¹æºæç¨çï¼éåä¸´æ¶æµè¯ç¨--> + <File name="log" fileName="log/test.log" append="false"> + <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> + </File> + <!-- è¿ä¸ªä¼æå°åºææçinfoå以ä¸çº§å«çä¿¡æ¯ï¼æ¯æ¬¡å¤§å°è¶ è¿sizeï¼åè¿size大å°çæ¥å¿ä¼èªå¨åå ¥æå¹´ä»½-æä»½å»ºç«çæä»¶å¤¹ä¸é¢å¹¶è¿è¡å缩ï¼ä½ä¸ºåæ¡£--> + <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" + filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> + <!--æ§å¶å°åªè¾åºlevelå以ä¸çº§å«çä¿¡æ¯ï¼onMatchï¼ï¼å ¶ä»çç´æ¥æç»ï¼onMismatchï¼--> + <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> + <Policies> + <TimeBasedTriggeringPolicy/> + <SizeBasedTriggeringPolicy size="100 MB"/> + </Policies> + </RollingFile> + <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" + filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> + <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> + <Policies> + <TimeBasedTriggeringPolicy/> + <SizeBasedTriggeringPolicy size="100 MB"/> + </Policies> + <!-- DefaultRolloverStrategy屿§å¦ä¸è®¾ç½®ï¼åé»è®¤ä¸ºæå¤å䏿件夹ä¸7个æä»¶ï¼è¿é设置äº20 --> + <DefaultRolloverStrategy max="20"/> + </RollingFile> + <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" + filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> + <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> + <Policies> + <TimeBasedTriggeringPolicy/> + <SizeBasedTriggeringPolicy size="100 MB"/> + </Policies> + </RollingFile> + </appenders> + <!--ç¶åå®ä¹loggerï¼åªæå®ä¹äºloggerå¹¶å¼å ¥çappenderï¼appenderæä¼çæ--> + <loggers> + <!--è¿æ»¤æspringåmybatisçä¸äºæ ç¨çDEBUGä¿¡æ¯--> + <logger name="org.springframework" level="INFO"></logger> + <logger name="org.mybatis" level="INFO"></logger> + <root level="all"> + <appender-ref ref="Console"/> + <appender-ref ref="RollingFileInfo"/> + <appender-ref ref="RollingFileWarn"/> + <appender-ref ref="RollingFileError"/> + </root> + </loggers> + </configuration> + ``` + + 6. å¯å¨æå¡è¿è¡éªè¯ + +* **Q: nettyçæ¬é®é¢** + + A: netty3ånetty4æ¯å®å ¨ä¸åç䏿¹ä»¶ï¼å ä¸ºåæ è·packageé½ä¸ç¸åï¼æä»¥å¯ä»¥å ±åï¼ä½æ¯è¦æ³¨æå°çæ¬é®é¢ï¼å°çæ¬å¿ 须使ç¨CSEççæ¬ã + +* **Q: æå¡è¶ æ¶è®¾ç½®** + + A: å¨å¾®æå¡æè¿°æä»¶ï¼microservice.yamlï¼ä¸æ·»å å¦ä¸é ç½®ï¼ + + ```yaml + cse: + request: + timeout: 30000 + ``` http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_faqs/cn/huawei-cloud-faq.md ---------------------------------------------------------------------- diff --git a/_faqs/cn/huawei-cloud-faq.md b/_faqs/cn/huawei-cloud-faq.md new file mode 100644 index 0000000..e66a69e --- /dev/null +++ b/_faqs/cn/huawei-cloud-faq.md @@ -0,0 +1,41 @@ +--- +title: "åä¸ºå ¬æäºå¸¸è§é®é¢" +lang: cn +ref: huawei-cloud-faq +permalink: /cn/faqs/faqs-huawei-cloud/ +excerpt: "åä¸ºå ¬æäºå¸¸è§é®é¢" +last_modified_at: 2017-10-29T15:01:43-04:00 +redirect_from: + - /theme-setup/ +--- + +1. **Q: å¨ä½¿ç¨åä¸ºå ¬æäºæ¶ï¼è®¾ç½®éåçæ ç¾åªéè¦åä¸ä¸æ¬¡çæ ç¾ä¸ä¸æ ·è¿æ¯è¦åä¹åçé½ä¸ä¸æ ·ï¼** + + A: ç±äºDockeræ¬èº«çæºå¶ä¸å¹¶æ²¡æå®ç°æ¯æ¬¡é½ä»è¿ç«¯æåéåçåè½ï¼å æ¤ï¼åªè¦æ¬å°ä¸æä¸ä¸ªçæ¬çéååå¨è䏿¯æ¬¡é½éè¿è¯¥çæ¬çæ ç¾æ¥è®¿é®éåæ¶ï¼è¯»åçéåå为æå¼å§ä¸ä¼ çéåï¼åç»å¯¹è¯¥æ ç¾éåçæ´æ°å¹¶ä¸ä¼å¨æ¬å°çæãå æ¤ç°æä¸¤ç§è§£å³æ¹æ¡ï¼ + + (1) æ°ä¸ä¼ çéåçæ ç¾åä¹åçé½ä¸ä¸æ ·ã + + (2) ç»å½å°åå°å»å°åçæ¬æ ç¾çéåå é¤ã + + æå±ï¼å¦æä½¿ç¨äºåä¸ºå ¬æäºä¸é¢çç¼æåè½ï¼åå¯ä»¥éè¿è®¾ç½®imagePullPolicy为Alwaysé¿å 该é®é¢ã + +2. **Q: åä¸ºå ¬æäºè¿è¡æ¶æ¥éï¼WARN com.huawei.paas.monitor.DataFactory: Upload monitor data error. 使ç¨çé 置为ï¼** + + ```yaml + cse: + monitor: + handler: + chain: + Provider: + default: bizkeeper-provider + ``` + + A: è¿ä¸ªæ¯é ç½®æä»¶çé误ï¼handleråºè¯¥æ¯å¨cseçä¸ä¸çº§è䏿¯monitorçä¸ä¸çº§ï¼æ£ç¡®çé ç½®æ¯ï¼ + + ```yaml + cse: + handler: + chain: + Provider: + default: bizkeeper-provider + ``` http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_faqs/faq.md ---------------------------------------------------------------------- diff --git a/_faqs/faq.md b/_faqs/faq.md new file mode 100644 index 0000000..9738dab --- /dev/null +++ b/_faqs/faq.md @@ -0,0 +1,59 @@ +--- +title: "FAQ" +lang: en +ref: common-faq +permalink: /faqs/ +excerpt: "FAQ" +last_modified_at: 2017-10-29T10:01:43-04:00 +--- + +1. **Q: What need to be cautious when using Java-Chassis?** + + A: There are a few restrictions when using Java-Chassis: + * Before version 0.3.0-SNAPSHOT, it does not support annotations like `@GetMapping`. + * When using the same HTTP request method, e.g. GET, the method name need to be unique as it will become operation ID when swagger generates contracts. + * Class and method name need to be public. + +2. **Q: When using the *spring-boot-starter-provider* dependency, property like `spring.main.web-environment` not working in *application.yml* file.** + + A: When you need both the starter provider dependency and the servlet, you need to declare `spring.main.web-environment` in *application.properties* file or declare it in *application.yml* file and create an empty *application.properties* file. + +3. **Q: What's the dependency differences between gateway and other microservices?** + + ```xml + <groupId>io.servicecomb</groupId> + <artifactId>spring-boot-starter-provider</artifactId> + ``` + + A: Gateway depends on not only the `spring-boot-starter-provider`, but also the `spring-boot-starter-discovery`. This can refer to the *manger* implementation of [LinuxCon-Beijing-Workshop](https://github.com/ServiceComb/LinuxCon-Beijing-WorkShop). + +4. **Q: Do gateway need to configure assembly like the other microservices? Is */maven/gateway* the default path of the docker maven plugin?** + + A: Yes. Docker maven plugin relies on the assembly files to generate docker image. */maven* is the default path of docker maven plugin and */gateway* is the path defined in the assembly file. + +5. **Q: Are there any restrictions of the return type of our API? Should it be the type of ResponseEntity?** + + A: No, examples can refer to [the implementation of integration-test](https://github.com/ServiceComb/java-chassis/blob/master/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java#L145) in java-chassis. + +6. **Q: Our API can not be accessed after microservices are up. It just returns *404 Not Found*. The codes we use is as follows:** + + ```java + @RestController + @RestSchema(schemaId = "worker") + public class WorkerController { + @RequestMapping(value="/count", method=RequestMethod.GET) + public int getWorkerNumbers() { + ... + } + } + ``` + + A: Without specifying the base path, ServiceComb will use the classname as the base path. Hence, the path should be `/WorkerController/count` in the previous code. If you want to access path like `/count`, you need to specify base path as `/` as follows: + ```java + @RequestMapping(value = "/") + public class WorkerController {} + ``` + +7. **Q: What\'s the default base path if I have not declared the value of RequestMapping annotation?** + + A: Supposed the class name of your controller is *HelloController*, the base path is /HelloController. http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_faqs/huawei-cloud-faq.md ---------------------------------------------------------------------- diff --git a/_faqs/huawei-cloud-faq.md b/_faqs/huawei-cloud-faq.md new file mode 100644 index 0000000..d93d971 --- /dev/null +++ b/_faqs/huawei-cloud-faq.md @@ -0,0 +1,41 @@ +--- +title: "Huawei Cloud FAQ" +lang: en +ref: huawei-cloud-faq +permalink: /faqs/faqs-huawei-cloud/ +excerpt: "Huawei Cloud FAQ" +last_modified_at: 2017-10-29T10:01:43-04:00 +redirect_from: + - /theme-setup/ +--- + +1. **Q: When we push images to Huawei Public Cloud, what needs to be careful about the image tag?** + + A: It needs to be different with all uploaded images. As Docker does not pull image from remote every time it starts up a container. Hence, the Docker does not know whether the image updated or not. There are two solutions for this: + + (1) Use different image tag every time you upload a image. + + (2) Delete the image in the backend manually. + + P.S. If you use the Huawei Cloud's orchestration, you can avoid this by setting *imagePullPolicy* to *Always*. + +2. **Q: We encountered this error when using Huawei Public Cloud: *WARN com.huaewi.paas.monitor.DataFactory: Upload monitor data error.* The configuration we use is as follows:** + + ```yaml + cse: + monitor: + handler: + chain: + Provider: + default: bizkeeper-provider + ``` + + A: There are mistakes in your configuration files. `handler` should be the child of `cse` instead of `monitor`. The right configuration should be as follows: + + ```yaml + cse: + handler: + chain: + Provider: + default: bizkeeper-provider + ``` http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_users/cn/faq.md ---------------------------------------------------------------------- diff --git a/_users/cn/faq.md b/_users/cn/faq.md deleted file mode 100644 index bc00ef6..0000000 --- a/_users/cn/faq.md +++ /dev/null @@ -1,415 +0,0 @@ ---- -title: "常è§é®é¢" -lang: cn -ref: faq -permalink: /cn/users/faq/ -excerpt: "常è§é®é¢" -last_modified_at: 2017-08-15T15:01:43-04:00 -redirect_from: - - /theme-setup/ ---- - -* **Q: 使ç¨Java-Chassisè¿ä¸ªæ¡æ¶æ¶æä»ä¹éè¦æ³¨æçå°æ¹ï¼** - - A: 使ç¨Java-Chassisæä»¥ä¸è¿äºéå¶ï¼ - (1) 0.3.0-SNAPSHOTä¹åççæ¬ä¸æ¯æç±»ä¼¼`@GetMapping`è¿æ ·çæ æ³¨ã - (2) æç¨å°çHTTPè¯·æ±æ¹æ³ä¸æ ·æ¶ï¼å¦GETï¼åæ¹æ³åä¸è½éè½½ãè¿æ¯ç±äºçæå¥çº¦æ¶æ¹æ³åä¼ä½ä¸ºå ¶Operation IDï¼æä»¥è¦ä¿è¯å ¶å¯ä¸æ§ã - (3) æ¹æ³åç±»å¿ é¡»æ¯publicçã - -* **Q: 使ç¨*spring-boot-starter-provider*è¿ä¸ªä¾èµæ¶ï¼å¨*application.yml*æä»¶ä¸å£°æç`spring.main.web-application`屿§å¹¶æ²¡æçæï¼** - - A: 使ç¨*starter-provider*è¿ä¸ªä¾èµæ¶ï¼å¦æç¨å°äºservletè¿ç§æ¹å¼æ¶ï¼éè¦å¨*application.properties*è¿ä¸ªæä»¶å¼å ¥`spring.main.web-application=true`è¿æ ·ç屿§æè å¨*application.yml*æä»¶ä¸å£°æï¼ä½æ¯æ¤æ¶éè¦æ°å»ºä¸ä¸ª*application.properties*çæä»¶ï¼å ¶å 容å¯ä»¥ä¸ºç©ºã - -* **Q: ç½å ³ä¾èµçjaråå ¶ä»å¾®æå¡ç䏿 ·åï¼** - - ```xml - <groupId>io.servicecomb</groupId> - <artifactId>spring-boot-starter-provider</artifactId> - ``` - - A: ç½å ³é¤äºè¦ä¾èµ`spring-boot-starter-provider`ä¹å¤è¿è¦ä¾èµ`spring-boot-starter-discovery`ï¼å¯ä»¥åè[LinuxCon-Beijing-Workshop](https://github.com/ServiceComb/LinuxCon-Beijing-WorkShop)ä¸managerçå®ç°ã - -* **Q: ç½å ³éè¦åå ¶ä»å¾®æå¡ä¸æ ·é ç½®assemblyåï¼å ¶ä¸ç/maven/gatewayè¿ä¸ªè·¯å¾æ¯docker maven pluginé»è®¤çåï¼** - - A: éè¦ï¼ç±äºé¡¹ç®ç°å¨ä½¿ç¨çæ¯spring-bootçæå æ¹å¼ï¼docker maven plugin乿¯ä¾èµæå çæçæä»¶æ¥çædockeréåçã/mavenè¿ä¸ªè·¯å¾æ¯docker maven pluginæå®çï¼ègatewayè¿ä¸ªè·¯å¾æ¯å¨assembly䏿å®çã - -* **Q: æå¡æ¥å£çè¿åç±»åå¯ä»¥æ¯ä»»æç±»ååï¼è¿æ¯å¿ é¡»æ¯responseEntityï¼** - - A: å¯ä»¥ï¼å ·ä½å¯ä»¥åèjava-chassisç[integration-testçå®ç°](https://github.com/ServiceComb/java-chassis/blob/master/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java#L145)ã - -* **Q: å¾®æå¡å¯å¨åï¼æ æ³æ£ç¡®è°ç¨æ¥å£ï¼ä½¿ç¨ç代ç 为ï¼** - - ```java - @RestController - @RestSchema(schemaId = "worker") - public class WorkerController { - @RequestMapping(value="/count", method=RequestMethod.GET) - public int getWorkerNumbers() { - ... - } - } - ``` - - A: 卿²¡ææææ ¹è·¯å¾çæ åµä¸ï¼é»è®¤ä¼ä½¿ç¨ç±»åä½ä¸ºå ¶æ ¹è·¯å¾ï¼å³ä¸è¿°ä»£ç ä¸å¯è®¿é®çè·¯å¾åºä¸º`/WorkerController/count`ã妿æ³è¦å®ç°`/count`è¿æ ·ç访é®ï¼åè¦æææ ¹è·¯å¾ï¼ - - ```java - @RequestMapping(value = "/") - public class WorkerController {} - ``` - -* **Q: å¦ææ²¡ææå®RequestMappingè¿ä¸ªæ 注çvalueæ¶ï¼é»è®¤çåºæ¬è·¯å¾æ¯ä»ä¹ï¼** - - A: åè®¾ä½ çControllerç±»å为*HelloController*ï¼é£ä¹åºæ¬è·¯å¾å°±æ¯/HelloControllerã - -* **Q: å¨eclipseä¸ä¿®æ¹äºmicroservice.yamlé ç½®æä»¶ä¸ç端å£å·ï¼å¯å¨ç¨åºåï¼ç«¯å£å·æ²¡çæï¼** - - A: éè¦åç¬å¯¼å ¥sample项ç®ï¼å¦æå¯¼å ¥æ´ä¸ªServiceComb-Java-Chassis项ç®ï¼ç±äºsampleç®å½ä¸å¨ServiceComb-Java-Chassis模åä¸ï¼IDEä¸ä¼å¯¹sampleè¿è¡ç¼è¯,eclipseä¸å¹¶æ²¡ææç¤ºé误信æ¯ï¼IDEAä¸ä¼ææç¤ºä¿¡æ¯ãå æ¤eclipseå¯å¨sampleçdemoä¼åç°ä¿®æ¹äºç«¯å£æ²¡æçæã - -* **Q: å¦ä½èªå®ä¹æä¸ªJavaæ¹æ³å¯¹åºçRESTæ¥å£éçHTTP Status Codeï¼** - - A: å¯¹äºæ£å¸¸çè¿åå¼ï¼å¯ä»¥éè¿SwaggerAnnotationå®ç°ï¼ä¾å¦ï¼ - - ```java - @ApiResponse(code = 300, response = String.class, message = "") - public int test(int x) { - return 100; - } - ``` - - 对äºå¼å¸¸çè¿åå¼ï¼å¯ä»¥éè¿æåºèªå®ä¹çInvocationExceptionå®ç°ï¼ä¾å¦ï¼ã - - ```java - public String testException(int code) { - String strCode = String.valueOf(code); - switch (code) { - case 200: - return strCode; - case 456: - throw new InvocationException(code, strCode, strCode + " error"); - case 556: - throw new InvocationException(code, strCode, Arrays.asList(strCode + " error")); - case 557: - throw new InvocationException(code, strCode, Arrays.asList(Arrays.asList(strCode + " error"))); - default: - break; - } - - return "not expected"; - } - ``` - - -* **Q: å¦ä½å®å¶èªå·±å¾®æå¡çæ¥å¿é ç½®?** - - A: ServiceCombä¸ç»å®æ¥å¿å¨ï¼åªæ¯ä½¿ç¨äºslf4jï¼ç¨æ·å¯ä»¥èªç±éæ©log4j/log4j2/logbackççãServiceCombæä¾äºä¸ä¸ªlog4jçæ©å±ï¼å¨æ ålog4jçåºç¡ä¸ï¼æ¯ælog4jçpropertiesæä»¶çå¢éé ç½®ã - * é»è®¤ä»¥è§åï¼"classpath\*:config/log4j.properties"å è½½é ç½®æä»¶ - * å®é ä¼æç´¢åºclasspath䏿æç```config/log4j.propertiesåconfig/log4j.*.properties```, ä»æç´¢åºçæä»¶ä¸ååº```\*```çé¨åï¼è¿è¡alphaæåºï¼ç¶åæé¡ºåºå è½½ï¼æååæçæä»¶ä½ä¸ºlog4jçé ç½®æä»¶ã - * 妿è¦ä½¿ç¨ServiceCombçlog4jæ©å±ï¼åéè¦è°ç¨Log4jUtils.initï¼å¦åå®å ¨ææ åçæ¥å¿å¨çè§å使ç¨ã - -* **Q: 彿å¡é ç½®äºå¤ä¸ªtransportçæ¶åï¼å¨è¿è¡æ¶æ¯æä¹éæ©ä½¿ç¨åªä¸ªtransportçï¼** - - A: - * ServiceCombçconsumerãtransportãhandlerãproducerä¹é´æ¯è§£è¦çï¼ååè½ä¹é´éè¿å¥çº¦å®ä¹èåå¨ä¸èµ·å·¥ä½çï¼å³ï¼ - consumer使ç¨éærpcï¼è¿æ¯springmvcå¼åä¸ä½¿ç¨highwayï¼è¿æ¯RESTfulå¨ç½ç»ä¸ä¼ è¾æ²¡æå ³ç³»ä¸produceræ¯ä½¿ç¨éærpcï¼è¿æ¯jaxrsï¼æè æ¯springmvcå¼åï¼ä¹æ²¡æå ³ç³»handlerä¹ä¸æç¥ï¼ä¸å¡å¼åæ¹å¼ä»¥åä¼ è¾æ¹å¼ - - * consumer访é®producerï¼å¨è¿è¡æ¶çtransportéæ©ä¸ï¼æ»è§åä¸ºï¼ - consumerçtransportä¸producerçendpointå交éï¼å¦æäº¤éåï¼è¿æå¤ä¸ªtransportå¯éæ©ï¼åè½®æµä½¿ç¨ - - åè§£å¼æ¥ï¼åå¨ä»¥ä¸åºæ¯ï¼ - - * å½ä¸ä¸ªå¾®æå¡producer忶弿¾äºhighway以åRESTfulçendpoint - * consumerè¿ç¨ä¸åªé¨ç½²äºhighway transport jarï¼ååªä¼è®¿é®producerçhighway endpoint - * consumerè¿ç¨ä¸åªé¨ç½²äºRESTful transport jarï¼ååªä¼è®¿é®producerçRESTful endpoint - * consumerè¿ç¨ä¸ï¼åæ¶é¨ç½²äºhighwayåRESTful transport jarï¼åä¼è½®æµè®¿é®producerçhighwayãRESTful endpoint - - å¦æï¼æ¤æ¶consumeræ³åºå®ä½¿ç¨æä¸ªtransport访é®producerï¼å¯ä»¥å¨consumerè¿ç¨çmicroservice.yamlä¸é ç½®ï¼æå®transportçåç§°: - - ```yaml - servicecomb: - references: - <service_name>: - transport: highway - ``` - - * å½ä¸ä¸ªå¾®æå¡produceråªå¼æ¾äºhighwayçendpoint - * consumerè¿ç¨åªé¨ç½²äºhighway transport jarï¼åæ£å¸¸ä½¿ç¨highwayè®¿é® - * consumerè¿ç¨åªé¨ç½²äºRESTful transport jarï¼åæ æ³è®¿é® - * consumerè¿ç¨åæ¶é¨ç½²äºhighwayåRESTful transport jarï¼åæ£å¸¸ä½¿ç¨highwayè®¿é® - - * å½ä¸ä¸ªå¾®æå¡produceråªå¼æ¾äºRESTfulçendpoint - * consumerè¿ç¨åªé¨ç½²äºhighway transport jarï¼åæ æ³è®¿é® - * consumerè¿ç¨åªé¨ç½²äºRESTful transport jarï¼åæ£å¸¸ä½¿ç¨RESTfulè®¿é® - * consumerè¿ç¨åæ¶é¨ç½²äºhighwayåRESTful transport jarï¼åæ£å¸¸ä½¿ç¨RESTfulè®¿é® - -* **Q: swagger bodyåæ°ç±»åå®ä¹é误ï¼å¯¼è´æå¡ä¸å¿æ³¨åçå 容没æç±»åä¿¡æ¯** - - **ç°è±¡æè¿°:** - - å®ä¹å¦ä¸æ¥å£ï¼å°åæ°æ¾å°bodyä¼ é - - ```yaml - /testInherate: - post: - operationId: "testInherate" - parameters: - - in: "body" - name: "xxxxx" - required: false - type: string - responses: - 200: - description: "response of 200" - schema: - $ref: "#/definitions/ReponseImpl" - ``` - - éç¨ä¸é¢æ¹å¼å®ä¹æ¥å£ã卿塿³¨å以åï¼ä»æå¡ä¸å¿æ¥è¯¢ä¸æ¥çæ¥å£type: string 丢失ï¼åæäºï¼ - - ```yaml - /testInherate: - post: - operationId: "testInherate" - parameters: - - in: "body" - name: "xxxxx" - required: false - responses: - 200: - description: "response of 200" - schema: - $ref: "#/definitions/ReponseImpl" - ``` - - 妿客æ·ç«¯æ²¡ææ¾ç½®swaggerï¼è¿ä¼æ¥åå¦ä¸å¼å¸¸ï¼ - - ```text - Caused by: java.lang.ClassFormatError: Method "testInherate" in class ? has illegal signature " - ``` - - Aï¼å®ä¹bodyåæ°çç±»åçæ¶åï¼éè¦ä½¿ç¨schemaï¼ä¸è½ç´æ¥ä½¿ç¨typeã - - ```yaml - /testInherate: - post: - operationId: "testInherate" - parameters: - - in: "body" - name: "request" - required: false - schema: - type: string - responses: - 200: - description: "response of 200" - schema: - $ref: "#/definitions/ReponseImpl" - ``` - -* **Q: ServiceCombå¾®æå¡æ¡æ¶æå¡è°ç¨æ¯å¦ä½¿ç¨é¿è¿æ¥?** - - A: http使ç¨çæ¯é¿è¿æ¥ï¼æè¶ æ¶æ¶é´ï¼ï¼highwayæ¹å¼ä½¿ç¨çæ¯é¿è¿æ¥ï¼ä¸ç´ä¿æï¼ã - -* **Q: æå¡æè¿æå¡ä¸å¿æ³¨åä¿¡æ¯æ¯å¦èªå¨å é¤** - - A: æå¡ä¸å¿å¿è·³æ£æµå°æå¡å®ä¾ä¸å¯ç¨ï¼åªä¼ç§»é¤æå¡å®ä¾ä¿¡æ¯ï¼æå¡çéææ°æ®ä¸ä¼ç§»é¤ã - -* **Q: å¦æä½¿ç¨tomcatæ¹å¼éæServiceCombå¾®æå¡æ¡æ¶ï¼å¦ä½å®ç°æå¡æ³¨å** - - A: å¦æä½¿ç¨cse sdk servletæ¹å¼ï¼ä½¿ç¨transport-rest-servletä¾èµï¼å¶ä½ä¸ºwarå é¨ç½²å°tomcatï¼éè¦ä¿è¯ï¼æå¡æè¿°æä»¶ï¼microservice.yamlï¼ä¸rest端å£é ç½®åå¤ç½®å®¹å¨ä¸è´æè½å®ç°è¯¥æå¡çæ£ç¡®æ³¨åãå¦åæ æ³æç¥tomcat弿¾ç«¯å£ã - -* **Q: å¦æä½¿ç¨tomcatæ¹å¼éæCSEå¾®æå¡æ¡æ¶ï¼æå¡æ³¨åçæ¶åå¦ä½å°warå é¨ç½²çä¸ä¸ææ³¨åå°æå¡ä¸å¿** - - A: å叿塿¥å£çæ¶åéè¦å°warå é¨ç½²çä¸ä¸æï¼contextï¼æ¾å¨baseurlæåé¢ï¼è¿æ ·æè½ä¿è¯æ³¨åå°æå¡ä¸å¿çè·¯å¾æ¯å®æ´çè·¯å¾ï¼å å«äºä¸ä¸æï¼ãå®ä¾ï¼ - - ```java - @path(/{context}/xxx) - class ServiceA - ``` - -* **Q: ServiceCombå¾®æå¡æ¡æ¶å¦ä½å®ç°æ°æ®å¤ä¸ªå¾®æå¡é´éä¼ ** - - A: - éä¼ æ°æ®å¡å ¥ï¼ - - ```java - CseHttpEntity<xxxx.class> httpEntity = new CseHttpEntity<>(xxx); - //éä¼ å 容 - httpEntity.addContext("contextKey","contextValue"); - ResponseEntity<String> responseEntity = RestTemplateBuilder.create().exchange("cse://springmvc/springmvchello/sayhello",HttpMethod.POST,httpEntity,String.class); - ``` - - éä¼ æ°æ®è·åï¼ - - ```java - @Override - @RequestMapping(path="/sayhello",method = RequestMethod.POST) - public String sayHello(@RequestBody Person person,InvocationContext context){ - //éä¼ æ°æ®è·å - context.getContext(); - return "Hello person " + person.getName(); - } - ``` - -* **Q: ServiceCombå¾®æå¡æ¡æ¶æå¡å¦ä½èªå®ä¹è¿åç¶æç ?** - - A: - ```java - @Override - @RequestMapping(path = "/sayhello",method = RequestMethod.POST) - public String sayHello(@RequestBody Person person){ - InvocationContext context = ContextUtils.getInvocationContext(); - //èªå®ä¹ç¶æç - context.setStatus(Status.CREATED); - return "Hello person "+person.getName(); - } - ``` - -* **Q: ServiceComb body Modelé¨åæ´é²** - - A: ä¸ä¸ªæ¥å£å¯¹åºçbody对象ä¸ï¼å¯è½æä¸äºå±æ§æ¯å é¨çï¼ä¸æ³å¼æ¾åºå»ï¼çæschemaçæ¶åä¸è¦å¸¦åºå»ï¼ä½¿ç¨ï¼ - - ```java - @ApiModelProperty(hidden = true) - ``` - -* **Q: ServiceCombæ¡æ¶è·åè¿ç«¯consumerçå°å** - - A: å¦æä½¿ç¨http restæ¹å¼ï¼ä½¿ç¨transport-rest-vertxä¾èµï¼å¯ä»¥ç¨ä¸é¢è¿ç§æ¹å¼è·åï¼ - - ```java - AbstractProducerContextArgMapper httpRequestCreator = (AbstractProducerContextArgMapper)invocation.getHandlerContext().get(RestConst.HTTP_REQUEST_CREATOR); - if(httpRequestCreator != null){ - HttpServletRequest req = (HttpServletRequest)httpRequestCreator.createContextArg(invocation); - System.out.println(req.getRemoteHost()); - } - ``` - - å®é åºæ¯æ¯æ¿æå¤å±çå°åï¼æä»¥åºè¯¥æ¯LBä¼ å ¥å°edgeserviceï¼edgeServiceåæ¾å°contextå¤ä¸ä¼ éã - -* **Q: ServiceComb䏿¯ææ³å** - - A: æç¡®ä¸æ¯æï¼éè¦ä¿®æ¹æ¥å£ï¼æ¥å£ä¿®æ¹åéè¦ä¿®æ¹çæ¬å·ï¼ä»¥å consumerè¿æ¯ä½¿ç¨æ§ççæ¬ã - -* **Q: ServiceComb对handleræè¿°** - - A: consumeré»è®¤çhandleræ¯simpleLBï¼æ²¡æé ç½®çæ¶åhandleré¾ä¼ä½¿ç¨è¿ä¸ªï¼å¦æé ç½®äºhandlerï¼éé¢ä¸å®è¦å å«lbçhandlerï¼å¦åè°ç¨æ¥éï¼éè¦å¨ææ¡£éé¢è¿è¡è¯´æã - -* **Q: ServiceCombæ¥å¿æ¿æ¢** - - A: CSE java-chassisæ¥å¿æ¨èæ¹å¼æ¯å¨å¯å¨çæ¶å使ç¨Log4jUtils.init\(\)ï¼ç´æ¥ä½¿ç¨æ¨èçLog4jæ¥åæ¥å¿ç®¡çï¼ä½æ¯æäºåºæ¯ä¸æ³ç¨log4jï¼æ¯å¦æ³ä½¿ç¨log4j2æè logbackï¼ä¸é¢ä»¥log4j2为ä¾ç®åä»ç»ä¸æ¥éª¤ï¼ - - 1. å¨ä»£ç éé¢ä¸è¦ä½¿ç¨Log4jUtils.init\(\)ï¼ - 2. 廿log4jçé ç½®æä»¶ï¼ä¸å æä¹æ²¡å ³ç³»ï¼å 为ä¸ä¼ä½¿ç¨ï¼ï¼ - 3. excludeæCSEæ¡æ¶å¼å ¥çlog4jï¼ä¾å¦ï¼ - ```xml - <dependency> - <groupId>io.servicecomb</groupId> - <artifactId>provider-springmvc</artifactId> - <exclusions> - <exclusion> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - </exclusion> - </exclusions> - </dependency> - ``` - 4. å¼å ¥log4j2çä¾èµ - - ```xml - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-slf4j-impl</artifactId> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-api</artifactId> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-core</artifactId> - </dependency> - ``` - - å¦ææ²¡æçæ¬ä¾èµç®¡çï¼è¿éè¦å¡«åä¸çæ¬å·ã - - 5. å å ¥log4j2çé ç½®æä»¶log4j2.xmlï¼å ³äºè¿ä¸ªè¯·æ¥ç宿¹è¯´æï¼ä¾å¦ï¼ - - ```xml - <?xml version="1.0" encoding="UTF-8"?> - <!--æ¥å¿çº§å«ä»¥åä¼å 级æåº: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> - <!--Configurationåé¢çstatusï¼è¿ä¸ªç¨äºè®¾ç½®log4j2èªèº«å é¨çä¿¡æ¯è¾åºï¼å¯ä»¥ä¸è®¾ç½®ï¼å½è®¾ç½®ætraceæ¶ï¼ä½ ä¼çå°log4j2å é¨åç§è¯¦ç»è¾åº--> - <!--monitorIntervalï¼Log4jè½å¤èªå¨æ£æµä¿®æ¹é ç½® æä»¶åéæ°é ç½®æ¬èº«ï¼è®¾ç½®é´éç§æ°--> - <configuration status="WARN" monitorInterval="30"> - <!--å å®ä¹ææçappender--> - <appenders> - <!--è¿ä¸ªè¾åºæ§å¶å°çé ç½®--> - <console name="Console" target="SYSTEM_OUT"> - <!--è¾åºæ¥å¿çæ ¼å¼--> - <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> - </console> - <!--æä»¶ä¼æå°åºææä¿¡æ¯ï¼è¿ä¸ªlogæ¯æ¬¡è¿è¡ç¨åºä¼èªå¨æ¸ 空ï¼ç±append屿§å³å®ï¼è¿ä¸ªä¹æºæç¨çï¼éåä¸´æ¶æµè¯ç¨--> - <File name="log" fileName="log/test.log" append="false"> - <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> - </File> - <!-- è¿ä¸ªä¼æå°åºææçinfoå以ä¸çº§å«çä¿¡æ¯ï¼æ¯æ¬¡å¤§å°è¶ è¿sizeï¼åè¿size大å°çæ¥å¿ä¼èªå¨åå ¥æå¹´ä»½-æä»½å»ºç«çæä»¶å¤¹ä¸é¢å¹¶è¿è¡å缩ï¼ä½ä¸ºåæ¡£--> - <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" - filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> - <!--æ§å¶å°åªè¾åºlevelå以ä¸çº§å«çä¿¡æ¯ï¼onMatchï¼ï¼å ¶ä»çç´æ¥æç»ï¼onMismatchï¼--> - <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> - <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> - <Policies> - <TimeBasedTriggeringPolicy/> - <SizeBasedTriggeringPolicy size="100 MB"/> - </Policies> - </RollingFile> - <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" - filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> - <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> - <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> - <Policies> - <TimeBasedTriggeringPolicy/> - <SizeBasedTriggeringPolicy size="100 MB"/> - </Policies> - <!-- DefaultRolloverStrategy屿§å¦ä¸è®¾ç½®ï¼åé»è®¤ä¸ºæå¤å䏿件夹ä¸7个æä»¶ï¼è¿é设置äº20 --> - <DefaultRolloverStrategy max="20"/> - </RollingFile> - <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" - filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> - <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> - <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> - <Policies> - <TimeBasedTriggeringPolicy/> - <SizeBasedTriggeringPolicy size="100 MB"/> - </Policies> - </RollingFile> - </appenders> - <!--ç¶åå®ä¹loggerï¼åªæå®ä¹äºloggerå¹¶å¼å ¥çappenderï¼appenderæä¼çæ--> - <loggers> - <!--è¿æ»¤æspringåmybatisçä¸äºæ ç¨çDEBUGä¿¡æ¯--> - <logger name="org.springframework" level="INFO"></logger> - <logger name="org.mybatis" level="INFO"></logger> - <root level="all"> - <appender-ref ref="Console"/> - <appender-ref ref="RollingFileInfo"/> - <appender-ref ref="RollingFileWarn"/> - <appender-ref ref="RollingFileError"/> - </root> - </loggers> - </configuration> - ``` - - 6. å¯å¨æå¡è¿è¡éªè¯ - -* **Q: nettyçæ¬é®é¢** - - A: netty3ånetty4æ¯å®å ¨ä¸åç䏿¹ä»¶ï¼å ä¸ºåæ è·packageé½ä¸ç¸åï¼æä»¥å¯ä»¥å ±åï¼ä½æ¯è¦æ³¨æå°çæ¬é®é¢ï¼å°çæ¬å¿ 须使ç¨CSEççæ¬ã - -* **Q: æå¡è¶ æ¶è®¾ç½®** - - A: å¨å¾®æå¡æè¿°æä»¶ï¼microservice.yamlï¼ä¸æ·»å å¦ä¸é ç½®ï¼ - - ```yaml - cse: - request: - timeout: 30000 - ``` http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/455450a0/_users/cn/huawei-cloud-faq.md ---------------------------------------------------------------------- diff --git a/_users/cn/huawei-cloud-faq.md b/_users/cn/huawei-cloud-faq.md deleted file mode 100644 index 42cba46..0000000 --- a/_users/cn/huawei-cloud-faq.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "åä¸ºå ¬æäºå¸¸è§é®é¢" -lang: cn -ref: huawei-cloud-faq -permalink: /cn/users/huawei-cloud-faq/ -excerpt: "åä¸ºå ¬æäºå¸¸è§é®é¢" -last_modified_at: 2017-08-15T15:01:43-04:00 -redirect_from: - - /theme-setup/ ---- - -1. **Q: å¨ä½¿ç¨åä¸ºå ¬æäºæ¶ï¼è®¾ç½®éåçæ ç¾åªéè¦åä¸ä¸æ¬¡çæ ç¾ä¸ä¸æ ·è¿æ¯è¦åä¹åçé½ä¸ä¸æ ·ï¼** - - A: ç±äºDockeræ¬èº«çæºå¶ä¸å¹¶æ²¡æå®ç°æ¯æ¬¡é½ä»è¿ç«¯æåéåçåè½ï¼å æ¤ï¼åªè¦æ¬å°ä¸æä¸ä¸ªçæ¬çéååå¨è䏿¯æ¬¡é½éè¿è¯¥çæ¬çæ ç¾æ¥è®¿é®éåæ¶ï¼è¯»åçéåå为æå¼å§ä¸ä¼ çéåï¼åç»å¯¹è¯¥æ ç¾éåçæ´æ°å¹¶ä¸ä¼å¨æ¬å°çæãå æ¤ç°æä¸¤ç§è§£å³æ¹æ¡ï¼ - - (1) æ°ä¸ä¼ çéåçæ ç¾åä¹åçé½ä¸ä¸æ ·ã - - (2) ç»å½å°åå°å»å°åçæ¬æ ç¾çéåå é¤ã - - æå±ï¼å¦æä½¿ç¨äºåä¸ºå ¬æäºä¸é¢çç¼æåè½ï¼åå¯ä»¥éè¿è®¾ç½®imagePullPolicy为Alwaysé¿å 该é®é¢ã - -2. **Q: åä¸ºå ¬æäºè¿è¡æ¶æ¥éï¼WARN com.huawei.paas.monitor.DataFactory: Upload monitor data error. 使ç¨çé 置为ï¼** - - ```yaml - cse: - monitor: - handler: - chain: - Provider: - default: bizkeeper-provider - ``` - - A: è¿ä¸ªæ¯é ç½®æä»¶çé误ï¼handleråºè¯¥æ¯å¨cseçä¸ä¸çº§è䏿¯monitorçä¸ä¸çº§ï¼æ£ç¡®çé ç½®æ¯ï¼ - - ```yaml - cse: - handler: - chain: - Provider: - default: bizkeeper-provider - ```
