• [技术干货] 如何评价华为新开源的ServiceComb微服务框架?
    作者:张琦首先ServiceComb基于华为内部的CSE(Cloud Service Engine)框架开源而来,这个框架在华为内部已经存在了2年多,支撑了多个大型的商业项目。有相对传统的企业级项目,也有类似手机应用这样的互联网属性比较强的项目。并且在成为整个华为公司统一的微服务标准框架后,依然有越来越多的产品在逐渐使用它开发自己的微服务。然后在今年刚刚开源出来。虽然已经商用在了多个项目中,但是因为刚刚开源出来,所以我们低调地给它起了0.X这样一个版本。。。但是Saga确实是属于探索型的项目,因此给它一个0.X的版本并不冤屈。对于通信性能,因为华为本身做通信起家,对于众多的程序员和程序员出身的领导来说,他可以不知道啥叫微服务,他也可以不知道治理是啥意思,他甚至可以不会Java,但是说起通信、性能、网络、RPC,是个人都可以开一堂课。所以这个框架从一开始在内部使用就在性能上面广受群狼的挑战。大家都在各种场景下对它做各种性能测试,然后各种挑战。。所以性能这块,无论是REST还是highway都在性能这块做足了功课。具体测试数据,各位可以自己试试。对于启动时间需要10s。。这个还请这位同学移步ServiceComb的社区,提个issue,大家一起分析一下为啥。我们这好像没有那么慢。对于Go、C、ServiceMesh的支持,可以剧透一下,go的部分马上就会开源出来。而C的部分,主要是内部使用,因为暂时没有看到外部需求所以还没有计划开源。而Service Mesh,已经在华为公有云的微服务引擎里面上线,虽然不开源,但是全免费使用,可以随意试用。回答那位“看了几眼”的同学,ServiceComb并不依赖zuul做gateway(同样性能原因,zuul的性能在华为内部根本不会被列为考虑对象),ServiceComb里面实现了一套Edge Service的开发框架,实现了zuul里面的很多能力而且性能有很大提升,这部分也应用在了内部某大型系统中。感兴趣的可以在社区里面看一下。当然它同样不阻碍你用zuul。我们实现了一个ServiceComb的DiscoveryClient。如果你希望用zuul,你可以按你原来的使用方法去用zuul一样没有问题。“不用SpringBoot的原因”,这个问题本身就有问题,因为ServiceComb并不阻碍你用SpringBoot,也不阻碍你用SpringCloud。如果你用这两个技术,可以把ServiceComb当做封装好了的几个starter,可以让你更方便地构建你的应用,就像楼主同学所说,在ServiceComb里面对Netflix OSS的一些组件做了很深度的集成和封装,不像SpringCloud这样一个大杂烩,在ServiceComb里面从头到尾进行了封装。你可以把它想象成是提供了类似Fegin的标记式开发方式,提供了SpringMVC的开发方式,提供了JAXRS的开发方式,然后对于你来说,这就够了,因为你用了这些开发方式开发了代码以后,LB、Hystrix已经被封装在后面了,你不用自己再去构建Command来用Hystrix。当然,如果你想自己扩展也可以。但是你也真的可以不用SpringBoot而只用ServiceComb。原因么,内部产品太多,各个团队水平和情况各不相同,有的就是不愿意用SpringBoot我们也没办法。动不动就说影响了他们几个亿的大买卖我们也很无奈啊。所以其实ServiceComb的第一个内部版本我们是依赖SpringBoot的,但是后面逐渐优化逐渐瘦身,开出来的版本已经不再强依赖SpringBoot了(注意,不依赖不表示不能一起用)。对于Dubbo,微服务不是说好了“各个微服务用最适合的语言写不能绑定语言”吗?不是说好的“每个进程是一个微服务”吗?所以我们认为它是一个非常优秀的SOA时代的RPC框架,但是就微服务而言,它还有一些问题。对于那位说避免使用框架的同学,我觉得不同的应用有不同的主要要解决的问题。有很多东西可能你并不需要,那真的可以自己全盘控制没有问题。但是如果你除了注册发现外,还想处理多种的本地负载均衡策略,想去处理错误隔离、降级、熔断,还想在各个点输出Metrics信息供APM用,另外还需要tracing的能力,那我建议还是找一个(类似ServiceComb全部封装好了的框架)或者根据自己的情况用多个框架,不要全部自己去写,比较复杂容易出错,而且维护起来比较麻烦。那位同学说的“杀出重围”什么的,实在是言重了。。我们只是在不断满足所有用户的需求,让它更易用,更稳定而已。实在没有想过要去打打杀杀。评价一下华为的ServiceComb,我感觉我们这个团队还有这个框架,没有办法的传承了华为公司的气质。我感觉就像是一个低调的程序员。一直在默默地完成着各方面提过来的各种需求,努力地守护着自己的代码,不让它出现一丝坏味道。但是让这个程序员当着几千人讲话,他可能就会说“我觉得我们的东西做的挺好的”,然后就没有然后了。然而代码就在那里,不悲不喜,不增不减。不去取悦于人,也不会辜负了谁。
  • 三分钟迁移Spring boot工程到Serverless
    前言Spring Boot已成为当今最流行的Java后端开发框架,典型的应用方式是在云上购买一台虚拟机,每天24小时在上面运行Java程序,在这种情况下,用户必须维护自己的虚拟机环境,而且按照包月包年等方式进行付费。华为云FunctionGraph(函数工作流服务)有着零运维、低成本计算的特点,FunctionGraph按需运行代码,无需配置和管理主机,您仅需为代码执行的每100ms和次数付费,如果代码没有运行的话,不会产生任何费用,而且每个月还有较多的免费额度。FunctionGraph有明显的成本和维护优势,但是怎样才能把标准的Spring Boot应用程序当做函数在FunctionGraph上运行起来呢?现在以我本地的一个SpringBoot工程(链接https://functionstage-examples.obs.cn-north-1.myhwclouds.com/ServerlessSpringBootDemo.zip)为例展示快速迁移到华为云FunctionGraph的流程。准备工作下载ServerlessSpringBoot2-1.0.0.jar(链接https://functionstage-examples.obs.cn-north-1.myhwclouds.com/ServerlessSpringBoot2-1.0.0.jar);迁移流程1、  制作函数zip包:按照上面的动图添加fgs.properties配置文件,增加两个配置项fgs.component-scan和fgs.mapper-scan,然后导包。 所得的ServerlessSpringBootDemo.zip就是最终的函数代码包。 2、  创建函数:在华为云入口找到FunctionGraph服务,进去后选择创建函数,函数名称建议设置为Controller中的根路径,例如本例的webtest,选择语言为Java8,另外设置函数执行入口为com.huawei.fgs.ext.handler.Main.handler,选择zip包方式上传代码(或者可以将代码先传入OBS桶,使用OBS上传方式创建),创建成功。3、  创建APIG触发器函数创建完成后修改内存为1024,修改超时时间为30(首次启动时间较长)并保存。接下来切换到触发器选项卡,点击创建触发器,选择APIG,将安全认证改成NONE,后端超时设置为30000,和函数超时保持一致,点击确定完成创建。检验结果直接在浏览器中访问APIG生成的URL,因为demo中的Controller中并没有匹配/webtest路径的RequestMapping,因此一开始提示找不到路径,稍加修改后可以看到效果:总结综上所述,整个迁移过程非常简单,用户无需改造自己的业务代码,只需在资源目录下新增fgs.properties文件即可,导包过程和常规情况稍有不同,按照上面的步骤也可以在数秒内完成,最后创建好函数和触发器之后,整个流程就完成了。注意事项1、  使用SpringBoot的AOP特性时,请不要将切面定义到Controller层,否则会导致无法使用;2、  目前Controller都会视作RestController,所有的接口均会以ResponseBody形式返回,暂时不支持返回html页面;3、  在application.properties中去掉server.port配置,加入spring.main.web-environment=false配置项可以小幅提升首次启动速度;4、  如果代码需要经常改动,请将所有的依赖包打包成一个zip,上传到OBS,创建函数时填入依赖代码包的地址,后续更新代码时,只需要上传一个小的jar包即可;5、  如果业务代码中使用了filter,需要对代码进行修改,具体方式后续会提供(本demo中有简单使用例子,依赖FunctionGraph的Java SDK(链接https://functionstage-sdk.obs.myhwclouds.com/java-sdk/fss-java-sdk-1.1.0.zip)中的Runtime-1.1.0.jar和ServerlessSpringBoot2-1.0.0.jar);6、  如果需要使用本demo的代码,请先把application.properties中的mysql信息改为自己的公网访问配置:另外在数据库中创建users表和books表。users表结构如下:books表结构如下:
  • 三分钟迁移Spring boot工程到Serverless
    前言Spring Boot已成为当今最流行的Java后端开发框架,典型的应用方式是在云上购买一台虚拟机,每天24小时在上面运行Java程序,在这种情况下,用户必须维护自己的虚拟机环境,而且按照包月包年等方式进行付费。华为云FunctionGraph(函数工作流服务)有着零运维、低成本计算的特点,FunctionGraph按需运行代码,无需配置和管理主机,您仅需为代码执行的每100ms和次数付费,如果代码没有运行的话,不会产生任何费用,而且每个月还有较多的免费额度。FunctionGraph有明显的成本和维护优势,但是怎样才能把标准的Spring Boot应用程序当做函数在FunctionGraph上运行起来呢?现在以我本地的一个SpringBoot工程(链接https://functionstage-examples.obs.cn-north-1.myhwclouds.com/ServerlessSpringBootDemo.zip)为例展示快速迁移到华为云FunctionGraph的流程。准备工作下载ServerlessSpringBoot2-1.0.0.jar(链接https://functionstage-examples.obs.cn-north-1.myhwclouds.com/ServerlessSpringBoot2-1.0.0.jar);迁移流程1、  制作函数zip包:按照上面的动图添加fgs.properties配置文件,增加两个配置项fgs.component-scan和fgs.mapper-scan,然后导包。 所得的ServerlessSpringBootDemo.zip就是最终的函数代码包。 2、  创建函数:在华为云入口找到FunctionGraph服务,进去后选择创建函数,函数名称建议设置为Controller中的根路径,例如本例的webtest,选择语言为Java8,另外设置函数执行入口为com.huawei.fgs.ext.handler.Main.handler,选择zip包方式上传代码(或者可以将代码先传入OBS桶,使用OBS上传方式创建),创建成功。3、  创建APIG触发器函数创建完成后修改内存为1024,修改超时时间为30(首次启动时间较长)并保存。接下来切换到触发器选项卡,点击创建触发器,选择APIG,将安全认证改成NONE,后端超时设置为30000,和函数超时保持一致,点击确定完成创建。检验结果直接在浏览器中访问APIG生成的URL,因为demo中的Controller中并没有匹配/webtest路径的RequestMapping,因此一开始提示找不到路径,稍加修改后可以看到效果:总结综上所述,整个迁移过程非常简单,用户无需改造自己的业务代码,只需在资源目录下新增fgs.properties文件即可,导包过程和常规情况稍有不同,按照上面的步骤也可以在数秒内完成,最后创建好函数和触发器之后,整个流程就完成了。注意事项1、  使用SpringBoot的AOP特性时,请不要将切面定义到Controller层,否则会导致无法使用;2、  目前Controller都会视作RestController,所有的接口均会以ResponseBody形式返回,暂时不支持返回html页面;3、  在application.properties中去掉server.port配置,加入spring.main.web-environment=false配置项可以小幅提升首次启动速度;4、  如果代码需要经常改动,请将所有的依赖包打包成一个zip,上传到OBS,创建函数时填入依赖代码包的地址,后续更新代码时,只需要上传一个小的jar包即可;5、  如果业务代码中使用了filter,需要对代码进行修改,具体方式后续会提供(本demo中有简单使用例子,依赖FunctionGraph的Java SDK(链接https://functionstage-sdk.obs.myhwclouds.com/java-sdk/fss-java-sdk-1.1.0.zip)中的Runtime-1.1.0.jar和ServerlessSpringBoot2-1.0.0.jar);6、  如果需要使用本demo的代码,请先把application.properties中的mysql信息改为自己的公网访问配置:另外在数据库中创建users表和books表。users表结构如下:books表结构如下:
  • [技术干货] 求助 SpringBoot Gradle 集成CSE
    都什么年代了,JAVA项目整体趋势是Gradle,到现在为止官网还没有给开发者提供一个SpringBoot Gradle集成CSE的指导,最近立项新项目,技术选型用的gradle作为编译,集成CSE真心蛋疼,各种报错,耗时耗功,跪求一个个SpringBoot Gradle集成CSE的指导
  • [分享交流] 创建第一个SpringBoot项目
    下载并安装好JDK。2.     下载SpringBoot开发工具STS,根据操作系统选择不同的STS下载。下载地址: https://spring.io/tools/sts/all3.     解压,双击 sts-bundle/sts-3.9.5.RELEASE/STS.exe 打开STS,填写workspace路径。4.     选择 File – New – Spring Starter Project,点击Next,选择Spring Boot版本,点击Finish。5.     选择 Windows – Preference – Maven – User Settings,选择Maven配置文件路径。6.     选中项目,右键 – Maven – Update Project。7.     运行项目,右键 – Run as – Spring Boot App。8.     编写hello world,新建一个Controller类。9.     重新运行项目,右键 – Run as – Spring Boot App。10.   浏览器输入 http://localhost:8080/hello 得到如下图所示结果,表示Springboot项目运行成功。
  • [技术干货] Spring Boot场景下启动失败: shouldn't have special char
    2019-01-18 17:12:48.711 ERROR 9456 --- [ntloop-thread-0] o.a.s.config.client.ConfigCenterClient   : Config update from https://cse.cn-north-1.myhuaweicloud.com failed.2019-01-18 17:12:48.711 ERROR 9456 --- [ntloop-thread-0] o.a.s.config.client.ConfigCenterClient   : Server error message is [{"error_code":"SVCSTG.CSE.400607","error_message":"According to the value of 'mutidimen.configKeyFormat', dimensionsInfo ('${spring.application.name}@houseapp#0.0.1') shouldn't have special char '[$, %, ^, &, +, /,  , \\]'"}].这个错误是由于微服务名称错误。 从日志看出,微服务名称是 ${spring.application.name} ,这个是一个place holer。 需要制定这个配置项的值。 
  • [技术干货] CSE 和 Spring Boot集成的时候报告Hystrix重复错误
    错误日志:  java.lang.IllegalStateException: Another strategy was already registered.     at com.netflix.hystrix.strategy.HystrixPlugins.registerCommandExecutionHook这个日志是由于spring boot也注册了hystrix,bizkeeper也会注册,hystrix不允许同时注册,但是又没接口能够判断是否已经注册(get方法有bug),所以会打印一个警告。 不影响功能。 如果没有bizkeeper的功能,可以在handler配置里面把他移除。 这样cse就不会尝试注册hystrix了,就没有这个异常了。 默认是这个,如果你们没定制的话:# 处理链配置  handler:    chain:      Provider:        default: qps-flowcontrol-provider,bizkeeper-provider      Consumer:        default: qps-flowcontrol-consumer,loadbalance,fault-injection-consumer,bizkeeper-consumer修改为:# 处理链配置  handler:    chain:      Provider:        default: qps-flowcontrol-provider      Consumer:        default: qps-flowcontrol-consumer,loadbalance,fault-injection-consumer当然也可以打个断点调试下registerCommandExecutionHook方法,看看spring boot 的哪个模块调用了这个方法。 如果不使用spring boot的功能不使用,去掉对应的jar包依赖也是可以的。 
  • [技术干货] Spring Boot定义的REST接口使用CSE框架后报告404
    定义了如下接口:  @GetMapping(path = "/v1/user111/ping", produces = MediaType.APPLICATION_JSON_VALUE)  String ping111()  {    return null;  }在Spring Boot下能够正常调用,切换CSE框架后,报告如下错误:o.a.s.c.rest.locator.OperationLocator    : locate path failed, status:Not Found, http method:GET, path:/v1/user111/ping/, microserviceName:user-service出现这个原因是因为这个接口不是public的, CSE约束所有发布为接口的方法,必须是public,而spring boot则没这个限制。 
  • [技术干货] CSE支持spring boot哪些版本
    从我们目前已知的情况, CSE支持spring boot 1和spring boot 2的所有版本,缺省依赖的是1.5.12.RELEASE和2.0.0.RELEASE。 CSE和Spring Boot集成的原理可以参考: https://bbs.huaweicloud.com/blogs/eca98a6f399a11e9bd5a7ca23e93a891 这里有和spring boot1和spring boot2的例子:   spring boot 2: https://github.com/huaweicse/cse-java-chassis-samples/tree/master/porter    spring boot 1: https://github.com/huaweicse/cse-java-chassis-samples/tree/master/springboot-sample spring boot1和spring boot2相关的pom依赖说明参考: https://huaweicse.github.io/cse-java-chassis-doc/using-cse-in-spring-boot/spring-boot-2.html
  • [教程] CSE21天--Day14操作实操指导
    以下以windows系统进行演示,linux类似,mac系统暂不支持1,下载mesher   下载地址:mesher    进入CSE界面后点击 开发工具,如下图2,配置及启动mesher 2.1,下载mesher后并解压后可以看到,以下目录2.2,修改mesher配置,在 {path}/mesher-1.5.2-windows-amd64/conf 进行配置配置修改,需修改以下三个文件    2.2.1,在auth.yaml文件中配置ak/sk,修改下图红框内容,配置如下    2.2.2,修改chassis,yaml文件监听地址为外部IP地址(端口不建议修改,如有修改在MyProxySelector.java中的端口亦须要修改),windows请使用ipconfig,linux使用ifconfig。获取示例将在文档末尾演示2.2.3 ,修改microservice.yaml文件,文件中添加APPLICATION_ID: APPLICATION_ID: Training21Days-HelloWorld 以及修改服务名为 springboot2.3,启动mesher    2.3.1,使用start.bat启动,启动前需要修改以下内容,将SET SPECIFIC_ADDR=127.0.0.1:3000    修改为SET SERVICE_PORTS=rest:9091修改后如下    2.3.2,修改完后,双击start.bat进行启动,可以看到 springboot服务,即为mesher启动成功3,启动springboot应用3.1,点击 Application.java 文件中进行启动。如下为idea启动4,启动Day11-homework的provider与consumer    4.1,启动前需要修改consumer(即client)端schema下的client.go文件,修改如下  4.2,修改后参考Day11启动实操启动,参考链接: https://bbs.huaweicloud.com/blogs/55dbff1d4d2e11e9bd5a7ca23e93a891   4.3,服务全部成功运行后,可以看到以下三个服务(此处需要注意的是,由于springboot没有接入CSE的能力,所有服务中心无法看到该服务,服务中心看到的springboot为mesher启动的服务)5,服务验证   5.1,验证springboot服务    访问springboot提供的provider接口进行验证,访问url: http://127.0.0.1:9091/provider/v0/hello/test-name  ,得到以下应答:  5.2,验证springboot调用go,通过访问访问consumer接口进行验证    5.2.1,springboot-consumer的hello接口提供的参数形式为path,访问url : http://127.0.0.1:9091/consumer/v0/hello/test-name ,得到以下应答:此时成功调用go后,mesher会出现如下日志:    5.2.2,打卡验证 ,访问url http://127.0.0.1:9091/consumer/v0/greeting 5.2.3,成功访问后,go-provider可以看到如下日志5.3,验证go调用springboot,通过访问Day11的consumer接口进行验证    5.3.1,访问hello接口 ,Day11的consumer的hello接口提供的参数形式为query,访问url:http://127.0.0.1:8081/consumer/v0/hello?name=test-name  ,得到以下应答此时go成功通过mesher调用spring boot后,mesher可以看到如下日志5.3.2,打卡验证    访问url: http://127.0.0.1:8081/consumer/v0/greeting  6,FAQ    6.1, SERVICE_PORTS 该如何配置?端口该如何确定?        SERVICE_PORTS支持配置有: SERVICE_PORTS=rest:{port},SERVICE_PORTS=grpc:{port},SERVICE_PORTS="rest:{port},grpc:{port}",支持以上三种配置方式。该如何确定端口呢,如下图。    6.2,代理应该如何设置?    代理的IP设置为127.0.0.1。设置的端口则为mesher监听的端口。6.3 为何需要设置外部IP地址?windows通过ipconfig进行获取该IP,如下:因为mesher通过配置为127.0.0.1还是外部地址判断mesher是作为provider的带来还是consumer的代理。此处mesher需要作为provider端(go---->mesher--->springboot)的代理,所以需要设置为外部IP地址。6.4,为何mesher启动后没有契约?需要通过配置SCHEMA_ROOT 来管理mesher的契约(mesh不会自动获取代理服务的契约)。契约管理 : https://support.huaweicloud.com/devg-cse/cse_mesh_0023.html
  • [问题求助] Springboot排除DispatcherServlet启动报错
    按照 https://docs.servicecomb.io/java-chassis/zh_CN/using-java-chassis-in-spring-boot/web-application.html 指导,在Springboot启动函数中添加“@SpringBootApplication(exclude=DispatcherServletAutoConfiguration.class)”,在microservice.yaml中添加“servicecomb.rest.servlet.urlPattern”,但是启动报错,如下图所示。指导文档:工程代码:报错:[ERROR] 2019-04-02 03:00:03,822 org.springframework.boot.SpringApplication -restartedMain- Application run failedorg.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatServletWebServerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedTomcat.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}.....Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
  • [问题求助] 华为SDK springboot项目打包部署到云服务器上
    想问一下有无springboot打包方法 按照网上的方法打包之后找不到主类 在jar中的Mainfest修改之后仍无法找到
  • [热门活动] 以springboot WEB容器方式启动时出现的NoClassDefFoundError异常
    以springboot  WEB容器方式启动时出现的NoClassDefFoundError异常:springboot版本:1.5.12CSE版本2.3.69(实际demo测试2.3.65版本及以上都会出现以下异常)demo链接(https://huaweicse.github.io/cse-java-chassis-doc/using-cse-in-spring-boot/java-application.html)org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedServletContainerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/EmbeddedServletContainerAutoConfiguration$EmbeddedTomcat.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.http.encoding-org.springframework.boot.autoconfigure.web.HttpEncodingProperties': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/validation/ClockProvider at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) ~[spring-context-4.3.20.RELEASE.jar:4.3.20.RELEASE] at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at com.github.yhs0092.javachassis.demo.AppMain.main(AppMain.java:12) [classes/:na]        .......Caused by: java.lang.NoClassDefFoundError: javax/validation/ClockProvider at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-6.0.14.Final.jar:6.0.14.Final] at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na] at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$ValidatedLocalValidatorFactoryBean.<init>(ConfigurationPropertiesBindingPostProcessor.java:413) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.getValidator(ConfigurationPropertiesBindingPostProcessor.java:370) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.determineValidator(ConfigurationPropertiesBindingPostProcessor.java:354) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:316) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:292) ~[spring-boot-1.5.12.RELEASE.jar:1.5.12.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) ~[spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1623) ~[spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.d**ateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE] ... 51 common frames omittedCaused by: java.lang.ClassNotFoundException: javax.validation.ClockProvider at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_191] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_191] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_191] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_191] ... 62 common frames omitted这种问题起因可能是你想以sprongboot WEB容器方式启动CSE并且打成可执行jar包,当你引入以下依赖时可能就会出现启动异常了<dependency>    <groupId>com.huawei.paas.cse</groupId>    <artifactId>cse-solution-service-engine</artifactId>    <exclusions>        <exclusion>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>        </exclusion>        <!--<exclusion>            <groupId>org.hibernate.validator</groupId>            <artifactId>hibernate-validator</artifactId>        </exclusion>-->    </exclusions></dependency>现阶段的解决办法是把cse-solution-service-engine的Hibernate-validator依赖排除掉,以上代码就是解决办法,去掉注释就OK了.
  • Spring boot2 集成cse 后 打包启动出现问题,outofmemory
    项目是用spring boot2 开发的,现在集成cse, 用的是web方式,用项目里本身使用的jetty容器, 依赖里引入一下compile("org.apache.servicecomb:spring-boot2-starter-servlet:1.2.1")compile("com.huawei.paas.cse:cse-solution-service-engine:2.3.70")做了一些代码上的改造, 加了microservice.yaml ,  在 intellij idea里可以正常运行, 但是打成jar包后在启动,发现问题,打印的日志:2019-07-24 13:29:59.887 - WARN 43428 --- [-thread-checker] io.vertx.core.impl.BlockedThreadChecker [line:51] : Thread Thread[vert.x-eventloop-thread-7,5,main] has been blocked for 4917 ms, time limit is 2000 ms2019-07-24 13:30:04.986 - WARN 43428 --- [-thread-checker] io.vertx.core.impl.BlockedThreadChecker [line:51] : Thread Thread[vert.xException in thread "qtp266273434-15" java.lang.OutOfMemoryError: MetaspaceException in thread "Thread-10" java.lang.OutOfMemoryError: Metaspace服务无法正常访问。 请问该怎么解决?
  • CSE导致Spring boot LocaleResolver 失效
    项目用Spring boot2 开发的, 原来通过Spring boot 默认的 AcceptHeaderLocaleResolver 机制,根据请求头中的Accept-Language 里值, 自动设定LocaleContextHolder了 Locale, 实现国际化, 集成了CSE后, 此功能失效了,Accept-Language里的值无法设定到 LocalContextHolder里, 从LocalContextHolder里取locale只能返回系统默认的语言,有什么办法解决?
总条数:29 到第
上滑加载中