• [技术干货] 使用CSE SDK如何在edge service拦截用户请求做认证鉴权
    认证鉴权的时候,通常会获取http header,对会话进行认证。 CSE SDK一般有两种方式拦截:* 通过Handler : 这种方式的好处是可以获取微服务元数据信息。对于需要做访问控制、获取调用的方法名称等,非常简单。   例子:https://github.com/huaweicse/cse-java-chassis-samples/blob/master/HouseAppWithSpringBoot2/edge-service/src/main/java/com/huawei/cse/houseapp/edge/ApiDispatcher.java  + AuthFilter.java* 通过HttpServerFilter: 这种机制的好处是在Http层拦截请求,可以操作HTTP的header等。   例子:https://github.com/apache/servicecomb-samples/blob/master/porter_lightweight/gateway-service/src/main/java/org/apache/servicecomb/samples/porter/gateway/ApiDispatcher.java  + AuthHandler.java
  • [问题求助] 网关接入 sdk 的时候报错了
    网关接入 sdk 的时候报错了19-04-08 21:03:41 TLS ERR: tlsssl connect error[1] errno[0] e:6****903-error:0****077:rsa routines:INT_RSA_VERIFY:wrong signature length
  • [教程] 导入CSEJavaSDK的demo工程,遇到maven依赖问题
    有些同学在导入CSEJavaSDK的demo工程的时候,会发现maven依赖没有导入进来。代码中很多类都是红的,显示无法找到类:此时大家可以跑一下mvn clean package构建命令,看看控制台里的输出日志:关键日志如下:Non-resolvable import POM: Failure to find com.huawei.paas.cse:cse-dependency:pom:2.3.62 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced @ line 18, column 19 -> [Help 2]可以看到,日志里显示maven在尝试从maven中央仓库拉取依赖包(这是maven的默认配置,也有可能是其他的错误地址),而不是从华为云镜像站拉取依赖。这就说明该环境上的maven setting文件没有按照Day2培训中的说明进行配置,建议大家按照操作指导再配置一下maven setting文件。
  • 华为云微服务CSEJavaSDK问题一:契约在SC中无法获取
    【摘要】 Idea启动provider后服务契约SC无法获取,Eclipse中启动正常Provider Log:2019-03-16 23:00:57,413 [ERROR] Can not output merged.log4j.properties,because can not write to directory of file file:/Users/zhenbing/.m2/reposit...Idea启动provider后服务契约SC无法获取,Eclipse中启动正常Provider Log:2019-03-16 23:00:57,413 [ERROR] Can not output merged.log4j.properties,because can not write to directory of file file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/transport-rest-vertx/1.1.0.B036/transport-rest-vertx-1.1.0.B036.jar!/config/base/log4j.properties org.apache.servicecomb.foundation.common.utils.Log4jUtils.outputFile(Log4jUtils.java:103)2019-03-16 23:00:57,427 [INFO] Found main class "com.intellij.rt.execution.application.AppMain". org.apache.servicecomb.foundation.common.utils.JvmUtils.findMainClass(JvmUtils.java:62)2019-03-16 23:00:57,490 [INFO] Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@97e1986: startup date [Sat Mar 16 23:00:57 CST 2019]; root of context hierarchy org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:583)2019-03-16 23:00:57,596 [INFO] Loading XML bean definitions from URL [jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/foundation-config/1.1.0.B036/foundation-config-1.1.0.B036.jar!/META-INF/spring/cse.bean.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)2019-03-16 23:00:57,892 [INFO] Loading XML bean definitions from URL [jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/foundation-vertx/1.1.0.B036/foundation-vertx-1.1.0.B036.jar!/META-INF/spring/cse.bean.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)2019-03-16 23:00:57,921 [INFO] Loading XML bean definitions from URL [jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/java-chassis-core/1.1.0.B036/java-chassis-core-1.1.0.B036.jar!/META-INF/spring/cse.bean.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)2019-03-16 23:00:58,863 [INFO] Loading XML bean definitions from URL [jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/handler-bizkeeper/1.1.0.B036/handler-bizkeeper-1.1.0.B036.jar!/META-INF/spring/cse.bean.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)2019-03-16 23:00:58,883 [INFO] Loading XML bean definitions from URL [jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/handler-loadbalance/1.1.0.B036/handler-loadbalance-1.1.0.B036.jar!/META-INF/spring/cse.bean.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)2019-03-16 23:00:58,904 [INFO] Loading XML bean definitions from URL [jar:file:/Users/zhenbing/.m2/repository/com/huawei/paas/cse/cse-handler-cloud-extension/2.3.62/cse-handler-cloud-extension-2.3.62.jar!/META-INF/spring/services.bean.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)2019-03-16 23:00:59,296 [INFO] Environment received, will get configurations from [org.springframework.core.env.StandardEnvironment@1532554556]. org.apache.servicecomb.config.ConfigurationSpringInitializer.setEnvironment(ConfigurationSpringInitializer.java:59)2019-03-16 23:00:59,336 [WARN] No URLs will be polled as dynamic configuration sources. com.netflix.config.sources.URLConfigurationSource.<init>(URLConfigurationSource.java:121)2019-03-16 23:00:59,336 [INFO] To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath. com.netflix.config.sources.URLConfigurationSource.<init>(URLConfigurationSource.java:122)2019-03-16 23:00:59,419 [INFO] create local config: org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:114)2019-03-16 23:00:59,419 [INFO]  jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/java-chassis-core/1.1.0.B036/java-chassis-core-1.1.0.B036.jar!/microservice.yaml. org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:116)2019-03-16 23:00:59,419 [INFO]  jar:file:/Users/zhenbing/.m2/repository/com/huawei/paas/cse/cse-solution-service-engine/2.3.62/cse-solution-service-engine-2.3.62.jar!/microservice.yaml. org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:116)2019-03-16 23:00:59,420 [INFO]  file:/Users/zhenbing/IdeaProjects/MicroService/Demo-Day4-Homework/helloworld-consumer/target/classes/microservice.yaml. org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:116)2019-03-16 23:00:59,458 [INFO] Found SPI service org.apache.servicecomb.config.spi.ConfigCenterConfigurationSource, count=1. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:79)2019-03-16 23:00:59,458 [INFO]   0. org.apache.servicecomb.config.archaius.sources.ConfigCenterConfigurationSourceImpl. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:82)2019-03-16 23:00:59,467 [INFO] create local config: org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:114)2019-03-16 23:00:59,467 [INFO]  jar:file:/Users/zhenbing/.m2/repository/org/apache/servicecomb/java-chassis-core/1.1.0.B036/java-chassis-core-1.1.0.B036.jar!/microservice.yaml. org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:116)2019-03-16 23:00:59,468 [INFO]  jar:file:/Users/zhenbing/.m2/repository/com/huawei/paas/cse/cse-solution-service-engine/2.3.62/cse-solution-service-engine-2.3.62.jar!/microservice.yaml. org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:116)2019-03-16 23:00:59,468 [INFO]  file:/Users/zhenbing/IdeaProjects/MicroService/Demo-Day4-Homework/helloworld-consumer/target/classes/microservice.yaml. org.apache.servicecomb.config.ConfigUtil.createLocalConfig(ConfigUtil.java:116)2019-03-16 23:00:59,476 [INFO] Found SPI service org.apache.servicecomb.deployment.DeploymentProvider, count=1. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:79)2019-03-16 23:00:59,476 [INFO]   0. org.apache.servicecomb.deployment.DefaultDeploymentProvider. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:82)缺少了产生swagger的步骤(下面是Eclipse输出的Log信息):2019-03-16 23:14:36,313 [INFO] Service startup completed! microservice.demo.training21days.provider.bootevent.CustomBootEventListener.onBootEvent(CustomBootEventListener.java:18)2019-03-16 23:14:36,313 [INFO] ============================= microservice.demo.training21days.provider.bootevent.CustomBootEventListener.onBootEvent(CustomBootEventListener.java:19)2019-03-16 23:14:36,319 [WARN] keyStore [server.p12] file not exist, please check! org.apache.servicecomb.foundation.vertx.VertxTLSBuilder.buildTCPSSLOptions(VertxTLSBuilder.java:118)2019-03-16 23:14:36,320 [WARN] trustStore [trust.jks] file not exist, please check! org.apache.servicecomb.foundation.vertx.VertxTLSBuilder.buildTCPSSLOptions(VertxTLSBuilder.java:138)2019-03-16 23:14:36,324 [INFO] Monitor data sender started. Configured data providers is {com.huawei.paas.monitor.HealthMonitorDataProvider,} com.huawei.paas.monitor.DataFactory.start(DataFactory.java:62)2019-03-16 23:14:36,325 [INFO] ServiceComb is ready. org.apache.servicecomb.core.SCBEngine$1.afterRegistryInstance(SCBEngine.java:188)2019-03-16 23:14:36,342 [INFO] Waiting for status up. timeout: 10000ms org.apache.servicecomb.core.SCBEngine.waitStatusUp(SCBEngine.java:362)2019-03-16 23:14:36,343 [INFO] Status already changed to up. org.apache.servicecomb.core.SCBEngine.waitStatusUp(SCBEngine.java:371)2019-03-16 23:15:06,343 [INFO] sc task interval changed from -1 to 30 org.apache.servicecomb.serviceregistry.task.ServiceCenterTaskMonitor.beginCycle(ServiceCenterTaskMonitor.java:39)
  • [问题求助] CSEJavaSDK maven依赖无法导入
    用VS code 搭建环境,已经成功安装JAVA1.8、Maven。已经在helloworld-consumer\src\main\resources\microservice.yaml文件中修改AK\SK;运行helloworld-consumer\src\main\java\microservice\demo\training21days\consumer\AppMain.java文件报错,如下图所示。
  • [技术干货] 使用CSEJavaSDK/ServiceComb-Java-Chassis开发的微服务,启动失败,找不到javax.xml.ws.Holder
    昨天有两个同学碰到CSEJavaSDK开发的demo服务跑不起来的问题,错误日志如下图,报找不到javax.xml.ws.Holder:碰到找不到类的问题,我们一般下意识都认为是maven的依赖导入有问题,但是这个类不是通过maven依赖导入的,仔细检查一下可以发现它是jre里提供的,通常不可能找不到的。经过沟通后发现问题的原因是Java版本不对,当前 CSEJavaSDK/ServiceComb-Java-Chassis 支持的是Java8,而这两位同学使用的是其他版本的Java。后续如果有人碰到找不到javax.xml.ws.Holder类的问题可以参考这个检查一下。
  • [问题求助] 关于liteos 与onenet的sdk适配问题
    请问,liteOS 是否有对移动onenet的模组sdk适配过,还是说onenet模组sdk要用liteos的话还是要做适配的?
  • [问题求助] obs_sdk_php分页列举全部对象Marker参数问题
    D/download0/原创类视频区/DRP原创/DRP原创第2部分/09_分销商修改页面显示.rar对象名不url编码,url格式就被破坏了;如果url编码,返回数据始终是头几条,并没有分页显示后面的数据Fatal error: Uncaught InvalidArgumentException: Unable to parse URI: https://obs-abab.obs.cn-north-1.myhuaweicloud.com:443?marker=D/download0/%E5%8E%9F%E5%88%9B%E7%B1%BB%E8%A7%86%E9%A2%91%E5%8C%BA/DRP%E5%8E%9F%E5%88%9B/DRP%E5%8E%9F%E5%88%9B%E7%AC%AC2%E9%83%A8%E5%88%86/09_%E5%88%86%E9%94%80%E5%95%86%E4%BF%AE%E6%94%B9%E9%A1%B5%E9%9D%A2%E6%98%BE%E7%A4%BA.rar&max-keys=100 in D:\web\ibeifeng\ibfCode\git_php\obsphp\vendor\guzzlehttp\psr7\src\Uri.php:71 Stack trace: #0 
  • [技术干货] 使用CSE SDK如何进行文件上传
    文件上传下载的开发文档参考:  *  https://docs.servicecomb.io/java-chassis/zh_CN/general-development/file-upload.html  * https://docs.servicecomb.io/java-chassis/zh_CN/general-development/file-download.html代码示例可以参考ServiceComb提供的DEMO:https://github.com/apache/servicecomb-java-chassis里面有大量的开发示例,下载的示例在DownloadSchema.java, 上传的在CodeFirstSpringmvc.java快速参考:上传  @RequestMapping(path = "/upload", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)   @Override   public String fileUpload(@RequestPart(name = "file1") MultipartFile file1,       @RequestPart(name = "someFile") MultipartFile file2, @RequestAttribute("name") String name) {     return super.fileUpload(file1, file2, name);   }下载  // generate HttpHeaders.CONTENT_DISPOSITION to be "attachment;filename=tempFilePart.txt" automatically   @GetMapping(path = "/tempFilePart")   public Part tempFilePart(String content) throws IOException {     File file = createTempFile(content);     return new FilePart(null, file)         .setDeleteAfterFinished(true)         .setSubmittedFileName("tempFilePart.txt");   }   @GetMapping(path = "/file")   public File file(String content) throws IOException {     return createTempFile("file.txt", content);   } 
  • [交流分享] 海思BC28_OPEN_CPU简单入门介绍(环境搭建_SDK_编译_下载)
    操作视频如下:需要依赖的软件:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>以上工具已经下载好了,下载链接如下:链接: https://share.weiyun.com/5GBLw90 (密码:TQ7E)另外microsoft.net framework如果没有安装或者版本不到4.5.2可能需要安装microsoft.net framework 4.5.2.exe1、gcc-arm-none-eabi-4_9-2015q3-20150921-win32.exe安装多次next后,提示如下,添加到系统环境变量中,勾选上然后一路next就安装好了,然后确认GCC是否安装成功,以及版本确认2、python-2.7.10.amd64.msi(我的电脑是win 7 64位,对应选择amd64)建议选择默认路径建议添加到系统环境变量中,选择添加确认python版本,注意要python2.7的3、pywin32-220.win-amd64-py2.7.exe安装4、python相关的pip安装5、scons-2.4.0-amd64-setup安装,对应系统32/64位选择会提示python的目录,注意对应python2.7安装(我这里是安装了多个python版本):6、找到SDK压缩包,解压如下:对应python2.7/scons安装路径修改socns_nws.bat的路径,如下编译一个新工程,直接运行scons_new.bat,可以直接拖拽近cmd:编译成功:编译完后是在…\BC28_OpenCPU_Hi1_SDK_V1.0\build_scons\arm\目录下有一个***.bin的文件需要将.bin的文件和原始fwpkg固件文件进行合成,这里就需要用到海思的另外一个工具,下面安装另外一个工具7、安装UpdatePackage-3.22.0.14.msi,双击安装8、执行"C:\Program Files(x86)\Neul\UpdatePackage\UpdatePackage.exe" updateApplication --in.\fwpkg\BC28JAR01A07.fwpkg --folder .\build_scons\arm --out BC28JAR01A07_OCN1命名可修改生成可下载的fwpkg升级文件下载工具,确认版本和IMEI号,加载版本点击Dowanload
  • [交流吐槽] python SDK 报错
    之前的问题自己操作失误,ps: 发现python SDK 的一个包(dto)放在demo下面了将下图的dto放入SDK 的client下即可
  • [技术干货] CSE JAVA SDK版本号规则
    CSE JAVA SDK使用service_description.version定义版本号, 目前推荐支持如下规则:x.y.z或者a.b.c.d其中x/y/z/a/b/c/d都是一个int值(short),不能超过2个字节(注意不是4个字节)的数字大小。 关于版本规则的特殊说明CSE JAVA SDK的版本号必须采用数字,而不能使用字符等特殊字符。 因为这个版本号,不是传统意义上的版本管理的概念,用于表达一些版本逻辑,比如主要、次要、补丁等。 CSE的版本号主要用于表达“接口兼容”性概念, 版本号变化表示可能存在接口变更。 在处理路由规则的时候,会基于契约和版本号进行分组,将兼容的接口分为一组,从而实现多版本并存和自动基于接口兼容性进行请求转发。 这个特性是CSE JAVA SDK非常独特的特性,优雅的解决了灰度版本并存的问题,而不需要用户做任何额外的开发。 关于接口兼容性的一些推荐实践参考:https://huaweicse.github.io/cse-java-chassis-doc/question-and-answer/interface-compatibility.html
  • [技术干货] CSE JAVA SDK如何使用openssl
    CSE JAVA SDK使用vertx的HTTP实现,支持客户端TLS和服务端TLS。 使用openssl 加上配置项:   ssl.engine: openssl即可。 文档参考:  https://docs.servicecomb.io/java-chassis/zh_CN/security/tls.html
  • [技术干货] CSE JAVA SDK 一个请求超时问题的定位
    某业务出现一个奇怪的消息,一个接口的调用始终超时, 错误消息为:The timeout period of 60000ms has been exceeded while executing POST /rest/csbmessagecenterservice/v1/config/email/test-email-config for host 172.16.1.186, server is rest://172.16.1.186:8443?sslEnabled=true详细日志中有如下内容,表示配置了重试,重试也是失败。用户使用postman直接请求,调用不会超时,而使用测试工具系统请求,则会超时。 一时不知道为什么。[2019-01-22 06:16:25:638] [ERROR] - [transport-vert.x-eventloop-thread-18] [org.apache.servicecomb.transport.rest.client.http.RestClientInvocation.lambda$invoke$0(RestClientInvocation.java:104)] - Failed to send request to /172.16.1.186:8443.io.vertx.core.http.impl.HttpClientRequestBase$1: The timeout period of 60000ms has been exceeded while executing POST /rest/csbmessagecenterservice/v1/config/email/test-email-config for host 172.16.1.186[2019-01-22 06:16:25:638] [ERROR] - [transport-vert.x-eventloop-thread-18] [org.apache.servicecomb.loadbalance.LoadbalanceHandler$4.lambda$null$0(LoadbalanceHandler.java:369)] - service CONSUMER rest CSBMessageCenterService.ApiMessageConfigResource.testEmailConfig, call error, msg is cause:InvocationException,message:InvocationException: code=490;msg=CommonExceptionData [message=Cse Internal Bad Request];cause:,message:The timeout period of 60000ms has been exceeded while executing POST /rest/csbmessagecenterservice/v1/config/email/test-email-config for host 172.16.1.186, server is rest://172.16.1.186:8443?sslEnabled=true[2019-01-22 06:16:25:639] [ERROR] - [transport-vert.x-eventloop-thread-18] [org.apache.servicecomb.loadbalance.LoadbalanceHandler$3.onExceptionWithServer(LoadbalanceHandler.java:294)] - Invoke server failed. Operation CONSUMER rest CSBMessageCenterService.ApiMessageConfigResource.testEmailConfig; server rest://172.16.1.186:8443?sslEnabled=true; 0-0 msg cause:InvocationException,message:InvocationException: code=490;msg=CommonExceptionData [message=Cse Internal Bad Request];cause:,message:The timeout period of 60000ms has been exceeded while executing POST /rest/csbmessagecenterservice/v1/config/email/test-email-config for host 172.16.1.186[2019-01-22 06:16:25:639] [ERROR] - [transport-vert.x-eventloop-thread-18] [org.apache.servicecomb.loadbalance.LoadbalanceHandler$3.onExecutionFailed(LoadbalanceHandler.java:322)] - Invoke all server failed. Operation CONSUMER rest CSBMessageCenterService.ApiMessageConfigResource.testEmailConfig, e=cause:InvocationException,message:InvocationException: code=490;msg=CommonExceptionData [message=Cse Internal Bad Request];cause:,message:The timeout period of 60000ms has been exceeded while executing POST /rest/csbmessagecenterservice/v1/config/email/test-email-config for host 172.16.1.186超时问题一般通过日志看不出根本原因。 建议业务先做了如下排查:查看服务端的access log,看是否有接受到请求;弄清楚问题出现的环节。 查看下打印超时日志的的服务的access log, 将调用目标服务的其他接口的访问情况观察看,看是一个接口超时还是所有接口都超时。通过日志看,很多接口都有超时,但也并不是每次都超时,只是有些请求超时。 一时找不到原因。 无赖只好自己把所有日志都拉出来,重新排查了一遍,最后发现业务开发者在排查第1步的都是搞漏了。 业务接口在某种输入情况下,处理时间超过8分钟,而access log是在业务处理完毕后打印的,包日志看漏了。 contract:172.16.3.8 - - - - [22/Jan/2019:03:26:16 +0000] "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" 400 72 8172.16.3.8 - - - - [22/Jan/2019:03:33:07 +0000] "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" 500 62 481105172.16.3.8 - - - - [22/Jan/2019:03:34:48 +0000] "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" 500 62 481116172.16.3.8 - - - - [22/Jan/2019:03:40:17 +0000] "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" 400 72 8172.16.3.8 - - - - [22/Jan/2019:03:41:44 +0000] "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" 400 72 7172.16.3.8 - - - - [22/Jan/2019:03:42:42 +0000] "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" 400 72 8edge:172.16.3.1 - 2019-01-22 03:25:06,271 "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" - 490 38 60003 809168370546  -- 业务22/Jan/2019:03:33:07返回,超过8分钟172.16.3.1 - 2019-01-22 03:26:16,297 "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" - 400 61 13 5c468d580e692bee172.16.3.1 - 2019-01-22 03:26:47,616 "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" - 490 38 60002 180593684930 -- 业务22/Jan/2019:03:34:48返回,超过8分钟172.16.3.1 - 2019-01-22 03:40:17,559 "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" - 400 61 12 5c4690a18978dcfe172.16.3.1 - 2019-01-22 03:41:44,823 "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" - 400 61 11 180593684930172.16.3.1 - 2019-01-22 03:42:42,757 "PUT /rest/csb/csbcontractservice/v1/business-change HTTP/1.1" - 400 61 12 180593684930为了让超时问题更好的得到定位,建议开发者每个服务都打开access log,便于分析。 对于性能问题,可能还需要打开metrics日志,分析瓶颈点。 
  • [技术干货] CSE JAVA SDK开发常见问题、误区及建议
    系统性问题:1.      整体服务架构和规模摸底a.       对服务规模(微服务数量,每个微服务的实例数,每个微服务的schema个数等)需要进行一定的评估,如果微服务总接口数非常多,并且所有服务的请求都经过Edge Service转发,建议Edge Service等需要调用大量其他服务的消费者设置较大的的JAVA metaspace空间, -XX:MaxMetaspaceSize=512m。 一个微服务接口数量太多还有个问题就是服务第一次被访问的时候,加载会比较慢。 对于对一次访问有明显要求的业务,可以考虑预加载提升访问速度。 2.       业务线程池配置a.       CSE提供的两个配置项servicecomb.rest.server.thread-count和servicecomb.rest.client.thread-count并不是业务线程池配置。这两个参数不需要配置的特别大,一般等于CPU核数即可,建议配置为8~16之间。b.      对于tomcat场景,以及Edge Service的vert.x场景,都有一个业务处理线程池(Edge Service的场景默认在reactive模式,是没有业务线程池的)。CSE设置的默认线程池的线程个数为2 * CPU个数。如果部分服务处理比较慢(比如评价时延>50ms),那么建议要设置一个较大的业务线程池,以提升吞吐量。如果所有接口都处理的很快,则不需要设置非常大的业务线程池,过多线程反而会因为线程调度,增加处理时延。如果一个微服务,有少量的几个接口处理非常耗时,需要考虑将这些接口放到独立的线程池执行(线程池隔离),防止访问慢的接口,影响访问快的接口。 3.       运维参数和建议a.       设置合理的超时时间。超时时间设置不能够小于3秒,即使业务处理时间都非常小(比如小于1ms)b.      打开metrics,用于分析性能瓶颈,并将日志输出到独立的日志文件c.       打开access logd.      对接APM的调用链,增强问题快速定界能力  4.       开发效率提升开发效率提升需要把一些准备工作放到平时,每个微服务尽可能梳理出本微服务对外的依赖关系,通过在本地安装依赖服务(或者提供模拟桩),实现在开发环境调试和验证微服务基本功能。这样能够大大提高开发效率,同时提升软件质量。 5.       SSL性能风险SSL在高并发、频繁断连重连的情况下,可能出现内存高、性能慢的情况。SSL协议慢是已知问题,并没有解决方案,对于对于时延要求很高,频繁超时、短连接,并发特别高等场景,不适合使用HTTPS。 目前有些产品的具体做法:1. 内部通讯使用HTTP;接入层使用HTTPS;2. 使用和验证HTTP2协议,降低连接数和连接重建。 这个可以纳入后续规划,以应对可能的用户增长问题。  开发常见错误:1.       业务中常驻线程或者定时任务的保护。 常驻线程或者定时任务的Task跑出异常, 会导致这些任务不再被调度执行。如果存在这种场景,一定要通过catch Throwable保证线程的可靠性。 可以通过通用的ThreadFactory创建线程实现,详细参考这个问题修改代码。2.       使用vert.x异步HttpClient一定需要注意设置如下几个异常处理器,保证异常的时候,异步回调能够正常执行。这类逻辑再CBC的Edge网关等场景也有使用,建议也排查下。a.       request.exceptionHandlerb.      response.exceptionHandler  --- 这个特别容易遗漏c.       response.bodyHandler3.       程序故障保护和运维方面的一些问题,保护错误,能够让程序在一些故障场景下能够有更好的适应性,但是实际上也会隐含的一层意思“业务故障可能被推迟发现”。 如果没有良好的运维机制,那么故障还是随着问题积累,慢慢的被发现。虽然从软件角度来讲,这个可以提高SLA的水平,是正向的,但是我们还是需要有一定的机制,能够先于用户发现问题。4.       Tomcat超时问题:maxKeepAliveRequests修改为-1, keepAliveTimeout建议是客户端的2倍5.       使用环境变量指定SC地址问题(以及其他需要使用yaml中的List类型情况):需要测试下配置两个IP地址的情况下,如果一个地址失败,是否访问第二个地址。案例参考: https://bbs.huaweicloud.com/forum/thread-13404-1-1.html