• [技术干货] CSE的REST接口存在重载的时候报错: OperationId must be unique
    Exception in thread "main" java.lang.IllegalStateException: ServiceComb init failed.at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:220)at org.apache.servicecomb.core.CseApplicationListener.onApplicationEvent(CseApplicationListener.java:81)at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)at org.apache.servicecomb.foundation.common.utils.BeanUtils.init(BeanUtils.java:49)at org.apache.servicecomb.foundation.common.utils.BeanUtils.init(BeanUtils.java:42)at com.icss.newretail.goods.GoodsMain.main(GoodsMain.java:7)Caused by: java.lang.Error: OperationId must be unique. com.icss.newretail.api.goods.StockApi:queryGoodsStockByOrgat org.apache.servicecomb.swagger.generator.core.SwaggerGenerator.scanMethods(SwaggerGenerator.java:281)at org.apache.servicecomb.swagger.generator.core.SwaggerGenerator.generate(SwaggerGenerator.java:140)at org.apache.servicecomb.core.definition.schema.AbstractSchemaFactory.generateSwagger(AbstractSchemaFactory.java:102)at org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory.createSchema(ProducerSchemaFactory.java:115)at org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory.createSchema(ProducerSchemaFactory.java:54)at org.apache.servicecomb.core.definition.schema.AbstractSchemaFactory.getOrCreateSchema(AbstractSchemaFactory.java:58)at org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory.getOrCreateProducerSchema(ProducerSchemaFactory.java:76)at org.apache.servicecomb.provider.rest.common.RestProducerProvider.init(RestProducerProvider.java:45)at org.apache.servicecomb.core.provider.producer.ProducerProviderManager.init(ProducerProviderManager.java:51)at org.apache.servicecomb.core.SCBEngine.doInit(SCBEngine.java:238)at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:209)... 13 more或者报告path重复Exception in thread "main" java.lang.IllegalStateException: ServiceComb init failed.at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:220)at org.apache.servicecomb.core.CseApplicationListener.onApplicationEvent(CseApplicationListener.java:81)at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)at org.apache.servicecomb.foundation.common.utils.BeanUtils.init(BeanUtils.java:49)at org.apache.servicecomb.foundation.common.utils.BeanUtils.init(BeanUtils.java:42)at com.icss.newretail.goods.GoodsMain.main(GoodsMain.java:7)Caused by: java.lang.Error: Only allowed one default path. com.icss.newretail.api.goods.StockApi:queryGoodsStockByOrgat org.apache.servicecomb.swagger.generator.core.OperationGenerator.addOperationToSwagger(OperationGenerator.java:424)at org.apache.servicecomb.swagger.generator.core.SwaggerGenerator.addOperationsToSwagger(SwaggerGenerator.java:289)at org.apache.servicecomb.swagger.generator.core.SwaggerGenerator.generate(SwaggerGenerator.java:141)at org.apache.servicecomb.core.definition.schema.AbstractSchemaFactory.generateSwagger(AbstractSchemaFactory.java:102)at org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory.createSchema(ProducerSchemaFactory.java:115)at org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory.createSchema(ProducerSchemaFactory.java:54)at org.apache.servicecomb.core.definition.schema.AbstractSchemaFactory.getOrCreateSchema(AbstractSchemaFactory.java:58)at org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory.getOrCreateProducerSchema(ProducerSchemaFactory.java:76)at org.apache.servicecomb.provider.rest.common.RestProducerProvider.init(RestProducerProvider.java:45)at org.apache.servicecomb.core.provider.producer.ProducerProviderManager.init(ProducerProviderManager.java:51)at org.apache.servicecomb.core.SCBEngine.doInit(SCBEngine.java:238)at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:209)... 13 more解决办法:给每个接口制定唯一的operationId和path  @GetMapping(path = "queryGoodsStockByOrgAndGoodsId")   @ApiOperation(nickname = "queryGoodsStockByOrgAndGoodsId", value = "")   public GoodsStockDTO queryGoodsStockByOrg(@RequestParam(name = "orgId") String orgId,       @RequestParam(name = "goodsId") String goodsId) {     return stockService.queryGoodsStockByOrg(orgId, goodsId);   }   @GetMapping(path = "queryGoodsStockByOrg")   public List<GoodsStockDTO> queryGoodsStockByOrg(@RequestParam(name = "orgId") String orgId) {     return stockService.queryGoodsStockByOrg(orgId);   }其中ApiOperation指定了唯一ID,GetMapping指定了不同的路径。
  • Day14 CSE实战之其他服务何如接入CSE 的作业的一个问题
    下载了mesher,改了ak,sk且成功运行了,然后启动springboot,也成功了,但是在运行day11的service服务时,却报了如下错误:2019-03-31 00:37:05.254 +08:00 ERROR server/server_manager.go:63 servers failed to start, err failed to start listener: listen tcp 127.0.0.1:9091: bind: An attempt was made to access a socket in a way forbidden by its access permissions.2019-03-31 00:37:05.254 +08:00 ERROR go-chassis/chassis.go:244 run chassis failed:can not start [rest] server,failed to start listener: listen tcp 127.0.0.1:9091: bind: An attempt was made to access a socket in a way forbidden by its access permissions.程序直接终止运行。 求大神指点附错误日志
  • CSE21天--Day12操作指导
    1 Day12---熔断操作    1.1 熔断相关配置介绍            熔断配置在consumer端的 circuit_breaker.yaml 配置文件中进行配置,也可以在chaasis.yaml文件中进行配置,但是整个chassis.yaml文件就显得比较臃肿,不便于配置的    查看以及修改,所以个人建议还是配置在 circuit_breaker.yaml文件中。--- cse:   isolation:     Consumer:       timeoutInMilliseconds: 1       maxConcurrentRequests: 1000如以上配置如果转化为 key:value 的配置形式,如下:cse.isolation.Consumer.timeoutInMilliseconds:1   # 超时配置,表示访问 1 ms就会超时 cse.isolation.Consumer.maxConcurrentRequests:100 # 最大并发请求连接数以上所看到的这部分配置实则跟熔断配置并没有任何关系,该部分配置,只是起到让访问超时报错的作用,下面才是真正的熔断配置:        cse.circuitBreaker.scope         该配置表示是否为API级别熔断,可配置为api或service               cse.circuitBreaker.Consumer.enabled        该配置表示是否开启熔断,如配置为false,则表示强制关闭熔断,熔断任何相关配置都将不生效        cse.circuitBreaker.Consumer.forceOpen        该配置表示是否手动开启熔断,手动开启熔断只要请求发生错误,立即进入熔断        cse.circuitBreaker.Consumer.forceClosed        该配置表示是否手动关闭熔断,手动关闭熔断表示即使请求发生错误,也不会进入熔断        cse.circuitBreaker.Consumer.sleepWindowInMilliseconds        该配置表示进入熔断后,多少 ms 后回复正常访问        cse.circuitBreaker.Consumer.requestVolumeThreshold        该配置表示计算错误阀值的请求数设置        cse.circuitBreaker.Consumer.errorThresholdPercentage        该配置表示错误的阀值,如可以设置为 30,70,此数值只能在1-100之间            以上为熔断的全部配置,服务级别的配置与上面类似,仅在 cse.circuitBreaker.Consumer后面加上服务名即可,如熔断开关配置:     cse.circuitBreaker.Consumer.{server_name}.enabled1.2 Day12--熔断效果图及配置    1.2.1 熔断测试配置如下以上配置红色框住的配置非熔断配置,仅代表了超时配置,此处配置超时是为了让请求产生错误返回,以达到产生熔断的效果。        1.2.1.1 熔断配置说明:        以上熔断配置中,enabled为true,forceOpen为false,forceClosed为false表示自动熔断,根据requestVolumeThreshold和errorThresholdPercentage自行计算并熔断。   1.2.2 测试熔断,配置完后,我们只需要请求时相应大于超时配置的值即可,根据上图我们我们可以相应时间大于 1ms,请求示例如下:        测试熔断时我们需要开启一个consumer和一个provider    请求url :  http://127.0.0.1:8080/consumer/v0/delay?t=120ms&delay=10&c=1 ,访问结果如下从上图可以看出,请求数达到10以后,计算错误阀值大于预设值,所以看是熔断,在等待10000ms后,我们继续访问服务,服务会恢复正常处理(虽然请求依旧会超时报错),效果如下: 此时由于报错,访问一次后将会继续进行熔断,再次等待10000ms后,程序恢复正常访问,此时我们修改访问的url使得程序能正常返回。此时应用将能正常返回,不会再报错。修改后的URl如下:url: http://127.0.0.1:8080/consumer/v0/delay?t=10ms&delay=1&c=1  2 Day12---熔错操作    容错,说白点就是go-chassis提供了在访问出错是的重试功能。2.1 容错相关配置说明    容错配置在consumer端的 load_balancing.yaml 配置文件中,以下为容错的详细配置说明。    cse.loadbalance.retryEnabled    该配置表示是否开启容错功能,默认不开启    cse.loadbalance.retryOnNext    该配置表示向下一个实例重试的次数    cse.loadbalance.retryOnSame     该配置表示向同一个实例重试的次数    cse.loadbalance.backoff.kind    该配置用于配置容错的类型,目前支持[jittered|constant|zero]三种 类型    cse.loadbalance.backoff.MinMs    配置最小重试间隔    cse.loadbalance.backoff.MaxMs    配置最大重试间隔2.2 Day12 容错配置    介绍完如何配置容错后,我们来配置Day12的容错。配置如下:原配置如下:在day12的配置中,红框内的配置是不需要的,此处我们可以将其删除并取消注释,如下:红圈内表示重试次数配置。2.3 测试容错    此处需要注意的是,容错功能我们需要开启两个实例才能进行容错,所以我们需要将Day12中的两个provider都运行起来。并注释熔断或删除熔断功能的配置,但是需要留下超时配置,以免影响测试效果。超时配置如下:同时需要检查provider端的chassis.yaml文件中以下红框内的配置是否有开启,如有开启,请将其注释,注释如下:测试容错前我们在consumer添加以下日志输出:访问URL:  http://127.0.0.1:8080/consumer/v0/delay?t=120ms&delay=10&c=1 ,访问之后,查看控制台信息,可以看到如下日志从以上日志可以看出,服务访问失败后,并没有重试就开始了下一次访问。2.3.1 打卡测试。 修改配置如下(配置修改后需要重启服务):修改并重启服务后,访问的url不需要修改直接访问,可以看到以下结果(如果一次访问出不来,可以访问多一次):以上红框中的日志可以看错,请求在首次访问失败后,向同一个实力重试了两次,向向下一个实例重试两次。2.3.2 重试机制    重试机制流程,如下图
  • [技术干货] query参数值包含分号的时候,CSE将其解析为两个参数
    问题说明:有些URL的参数值包含逗号、分号,比如:http://host?param=1,2,3;4,5,6CSE解析的时候,将其解析为 param = 1,2,3 和 4,5,6=  两个参数。 但是在Tomcat(比如spring boot运行时), 解析为一个参数 param = 1,2,3;4,5,6问题原因:早期HTTP服务器的实现,分号(;)和连接号(&) 被不同的服务器用于param的分隔符。 后来HTTP协议标准化了,推荐用连接号(&), 但是分号(;)仍然被定义为了保留字。有些WEB SERVER的实现把分号(;)和连接号(&)同等对待(比如CSE的vert.x),另外一些WEB服务器没考虑分号(;),比如TOMCAT。解决方案vert.x和tomcat实现不一致,都没违背HTTP协议标准,但是给开发者带来了误解。 由于分号(;)和连接号(&)在HTTP协议里面都是保留字,如果作为参数值,保留字是需要转义的。 因此这类问题应该定义为客户端BUG,在拼接URL前,需要先进行转义。 http://host?param=1,2,3%3B4,5,6  (encodeURIComponent会给逗号也转码,这里供参考)
  • [教程] 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
  • [教程] CSE21天 ---Day14
    如果接入mesher遇到以下错误:(如遇到非以下错误也请检查一下以下配置,也许也能解决问题)或者其他关于mesher都检查以下文件内容是否和以下一致:获取IP:windows使用ipconfigLinux使用 ifconfig
  • [技术干货] 【CSEJavaSDK/ServiceComb】详解契约校验失败导致的微服务实例注册失败问题
    相信不少同学在使用 CSEJavaSDK / ServiceComb-Java-Chassis 开发微服务的过程中都碰到过修改了服务接口后服务就无法启动的情况。控制台上会打出如下的异常栈:Exception in thread "main" java.lang.IllegalStateException: ServiceComb init failed. at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:220) at org.apache.servicecomb.core.CseApplicationListener.onApplicationEvent(CseApplicationListener.java:81) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) at org.apache.servicecomb.foundation.common.utils.BeanUtils.init(BeanUtils.java:49) at org.apache.servicecomb.foundation.common.utils.BeanUtils.init(BeanUtils.java:42) at microservice.demo.training21days.provider.AppMain.main(AppMain.java:9) Caused by: java.lang.IllegalStateException: The schema(id=[hello]) content held by this instance and the service center is different. You need to increment microservice version before deploying. Or you can configure service_description.environment=development to work in development environment and ignore this error at org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.compareAndReRegisterSchema(MicroserviceRegisterTask.java:277) at org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchema(MicroserviceRegisterTask.java:206) at org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:170) at org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.doRegister(MicroserviceRegisterTask.java:122) at org.apache.servicecomb.serviceregistry.task.AbstractRegisterTask.doRun(AbstractRegisterTask.java:41) at org.apache.servicecomb.serviceregistry.task.AbstractTask.run(AbstractTask.java:53) at org.apache.servicecomb.serviceregistry.task.CompositeTask.run(CompositeTask.java:35) at org.apache.servicecomb.serviceregistry.task.ServiceCenterTask.init(ServiceCenterTask.java:82) at org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry.run(AbstractServiceRegistry.java:178) at org.apache.servicecomb.serviceregistry.registry.RemoteServiceRegistry.run(RemoteServiceRegistry.java:86) at org.apache.servicecomb.serviceregistry.RegistryUtils.run(RegistryUtils.java:70) at org.apache.servicecomb.core.SCBEngine.doInit(SCBEngine.java:255) at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:209) ... 13 more其实这里抛出的异常已经告诉大家问题的原因和解决方式了。问题原因是这个服务在服务中心里注册的契约内容和这个实例实际持有的契约内容不一致(契约的id也打出来了,这里是"hello")。至于解决方案,这里给出了两种:增加微服务的版本,也就是要修改`microservice.yaml`配置文件里的`service_description.version`配置项的值将环境更改为开发环境,也就是在`microservice.yaml`配置文件里加上一个配置 `service_description.environment=development`那么这里的两种问题解决方式应该选择哪一种呢,还有其他的解决方式吗?我们还是得先从服务契约本身说起。一个 ServiceComb-Java-Chassis 框架的微服务在启动时会扫描它全部的REST接口类,并根据这些接口类生成对应的服务契约,并确保它们随着自己的服务记录一起注册到了服务中心。服务契约不仅仅是一份“接口文档”,同时它也约束着微服务的运行时行为。微服务会根据服务契约来确定如何调用其他服务,以及如何执行参数的序列化、反序列化操作等等。 也就是说, ServiceComb-Java-Chassis 的服务契约,不是那种大家开发完新功能后想起来要更新了就去改一下,忘记了或者没时间就不改的“接口说明文档”。它跟服务的接口有着严格的对应关系。如果契约不一样的话,那么就说明,你的服务,真的,有接口变化。说到接口变化,大家都知道这是一个比较严肃的事情了。通常一个服务的接口都应该是经过设计和评审的,不能轻易改变(跟其他服务联调过的同学对这个应该有体会吧?)。 在正式的环境(生产环境)下,服务接口变更发生在什么时候呢?答案是,服务版本变更的时候。抛开那些不按套路出牌的开发团队不谈,一般情况下一个服务版本应该上线哪些功能,提供哪些接口,都是应该有规划和记录的。也就是说,一个服务的每个版本的接口都是确定的,不应该出现一个版本的服务有两套不同的接口的情况。到这里,大家知道为什么你会碰到本文开头碰到的问题了吧? 原因很明确,就是你不应该在一个版本的微服务里给出两套不相同的接口。想想如果你的生产环境里,同一个版本的微服务混进去了一批接口不一样的服务实例(微服务架构下通常都是多实例部署服务的),那么你的系统一会儿可以正常工作,一会儿报各种参数错误、接口不存在之类的问题。这些问题的表象可能会显得很隐晦、随机或者复杂,而你在线上环境里很难排查出来。 为了避免将这类问题引入到线上, CSEJavaSDK / ServiceComb-Java-Chassis 采取了严格的服务契约校验策略,确保你的线上的服务一定是接口一致的。所以异常里给出的两种解决方案其实也是针对不同的场景的:如果你正在开发新版本的服务,接口本来就变来变去的没定下来,那么你可以把你的微服务的环境改为开发环境(service_description.environment=development),此时微服务框架允许你变更你的接口并更新注册到服务中心。如果是测试、生产环境,这个时候服务接口应该稳定下来了,服务契约不同通常意味着这应该是一个新版本。那么你应该给你的服务分配一个更新的版本号了。顺带一提,开发自测时还有一种问题解决办法,就是直接把服务中心里的旧服务记录删掉,更简单 ; )删完记得把上游调用它的服务重启一下,consumer端只加载一次provider的服务契约,之后不再动态刷新的
  • 求助 springcloud介入cse注册不上
    2019-03-22 15:25:04.396 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [The timeout period of 9000ms has been exceeded while executing GET /v3/default/configuration/items?dimensionsInfo=gateway-server%40spring-cloud-application%231.0.0&revision=default for host cse.cn-north-1.myhuaweicloud.com].2019-03-22 15:25:15.163 ERROR: [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.RestUtils[93] - GET /v4/default/registry/existence?appId=spring-cloud-application&type=microservice&serviceName=gateway-server&env&version=1.0.0 fail, endpoint is cse.cn-north-1.myhuaweicloud.com:443, message: Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:4432019-03-22 15:25:15.164 WARN : [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl[105] - invoke service [/v4/default/registry/existence] failed, retry.2019-03-22 15:25:15.165 INFO : [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.IpPortManager[100] - Change service center address from cse.cn-north-1.myhuaweicloud.com:443 to cse.cn-north-1.myhuaweicloud.com:4432019-03-22 15:25:16.440 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:443].2019-03-22 15:25:28.593 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [The timeout period of 9000ms has been exceeded while executing GET /v3/default/configuration/items?dimensionsInfo=gateway-server%40spring-cloud-application%231.0.0&revision=default for host cse.cn-north-1.myhuaweicloud.com].2019-03-22 15:25:36.234 ERROR: [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.RestUtils[93] - GET /v4/default/registry/existence?appId=spring-cloud-application&type=microservice&serviceName=gateway-server&env&version=1.0.0 fail, endpoint is cse.cn-north-1.myhuaweicloud.com:443, message: Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:4432019-03-22 15:25:36.235 WARN : [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl[105] - invoke service [/v4/default/registry/existence] failed, retry.2019-03-22 15:25:36.236 INFO : [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.IpPortManager[100] - Change service center address from cse.cn-north-1.myhuaweicloud.com:443 to cse.cn-north-1.myhuaweicloud.com:4432019-03-22 15:25:40.648 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:443].2019-03-22 15:25:52.813 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [The timeout period of 9000ms has been exceeded while executing GET /v3/default/configuration/items?dimensionsInfo=gateway-server%40spring-cloud-application%231.0.0&revision=default for host cse.cn-north-1.myhuaweicloud.com].2019-03-22 15:25:57.325 ERROR: [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.RestUtils[93] - GET /v4/default/registry/existence?appId=spring-cloud-application&type=microservice&serviceName=gateway-server&env&version=1.0.0 fail, endpoint is cse.cn-north-1.myhuaweicloud.com:443, message: Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:4432019-03-22 15:26:04.862 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:443].2019-03-22 15:26:17.037 ERROR: [config-center-vert.x-eventloop-thread-0] org.apache.servicecomb.config.client.ConfigCenterClient[426] - Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [The timeout period of 9000ms has been exceeded while executing GET /v3/default/configuration/items?dimensionsInfo=gateway-server%40spring-cloud-application%231.0.0&revision=default for host cse.cn-north-1.myhuaweicloud.com].2019-03-22 15:26:18.415 ERROR: [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.RestUtils[93] - POST /v4/default/registry/microservices fail, endpoint is cse.cn-north-1.myhuaweicloud.com:443, message: Connection timed out: no further information: cse.cn-north-1.myhuaweicloud.com/43.254.0.77:4432019-03-22 15:26:18.416 WARN : [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl[105] - invoke service [/v4/default/registry/microservices] failed, retry.2019-03-22 15:26:18.417 INFO : [registry-vert.x-eventloop-thread-0] org.apache.servicecomb.serviceregistry.client.IpPortManager[100] - Change service center address from cse.cn-north-1.myhuaweicloud.com:443 to cse.cn-north-1.myhuaweicloud.com:443
  • [技术干货] CSE 的 edge service 有没有关于转发请求头的配置
    Q: edge service 有没有关于转发请求头的配置。现在的问题是, 在Head 里面的叫Authorization 的参数,到Edgeservice 的dispatch 里面就没了?A: 取决于转发给三方服务还是基于servicecomb的服务?如果是自定义的dispatcher转发给非servicecomb运行时的服务,是不会丢失的。如果是servicecomb的服务,是会丢失的,servicecomb只转发在“契约”(接口定义)里面显示声明的参数。如果期望edge传递一些控制消息,需要通过Context来传递,即edge把header读取出来,放到Context里面。 这里的例子演示了怎么传递权限信息给微服务:如果期望edge传递一些控制消息,需要通过Context来传递,即edge把header读取出来,放到Context里面。 这里的例子演示了怎么传递权限信息给微服务: https://github.com/huaweicse/cse-java-chassis-samples/tree/7de5db bcfae46865966140eecdb3dad43c85f2b4/porter 
  • 求助 华为CSE下载不了本地工程,点击创建没有反应
  • [问题求助] 华为云微服务CSE在使用过程中遇到的一些问题
    华为云微服务CSE在使用过程中遇到的一些问题,问题描述如下:服务提供者 provider  , 在使用idea使用run启动入口类的时候,服务可以正常启动,在servicecenter中可以看到provider服务正常,但是在服务详情中无法查看到服务契约,在控制台也无法看到生成服务契约(如图1)。 但是如果在idea中使用debug模式启动入口类 ,服务可以正常启动,服务契约也可正常查看,控制台也可以看到生成服务契约的日志(如图二)初步怀疑是无法扫描到schema注解所致,可是却无法更详细的定位方法 ,求此领域大神指点一二图一如下:图二如下:
  • [教程] 导入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文件。
  • [问题求助] 如何获取CSE帮助以及技术干货汇总
    CSE和ServiceComb有非常紧密的联系,开源的帮助材料也适用于CSE的开发。# 商业渠道a. CSE是华为云ServiceStage的子功能,主要提供基于servicecomb-java-chassis(ServcieComb引擎)、spring cloud(Spring Cloud引擎)的微服务全生命周期管理。 ServiceStage 产品介绍页: https://www.huaweicloud.com/product/servicestage.html , ServiceStage 产品帮助页: https://support.huaweicloud.com/servicestage/index.html 。帮助页可以获取到产品介绍、应用场景、开发指南、优秀实践等多方面内容。b. 微服务培训课程: 进入华为云学院, https://edu.huaweicloud.com/courses/, 搜索 “微服务”, 可以找到相关的微服务课程。c. 通过提交工单、购买咨询和专业服务等获取工程师的协助。# 开源渠道a. ServiceComb官网: https://servicecomb.apache.org/cn/ 。 官网包含 ServiceComb 的最新动态、版本信息、 开发指南和技术博文等帮助信息。 通过官网,还可以获取到邮件列表、开发者信息等,和开发者进行在线交流。b. issues: issues是github为开源项目提供的交流空间,可以进行提问或者提交bug。 ServiceComb项目列表: https://github.com/apache?utf8=%E2%9C%93&q=servicecomb&type=&language= 。 c. 搜索和关注微信公众号“微服务蜂巢”,定期会推送相关技术文章、新功能和案例。# 个人贡献者a. 开发指南: 和华为云有关的场景: https://huaweicse.github.io/cse-java-chassis-doc/b. 使用google, bing, sogo或者baidu进行搜索    搜索的时候,可以采用以下技巧,比如:    使用站内搜索,提升准确性:CSE Spring Boot MVC site:bbs.huaweicloud.com    搜索包含关键日志:比如 CSE Spring Boot MVC     尝试多个搜索引擎:比如谷歌、搜狗、bing、百度等。c. 个人贡献者      liubao68的华为云博客: https://bbs.huaweicloud.com/community/iblognew/id_1505821502554271   liubao68的知乎博客: https://zhuanlan.zhihu.com/solve-problem-use-microservices   # 技术干货:    打造一个企业级应用的微服务开发框架(上)---从服务注册中心到服务管理中心: https://bbs.huaweicloud.com/blogs/8c98dc59412611e89fc57ca23e93a89f    打造一个企业级应用的微服务开发框架(下)---ServiceComb通信处理详解: https://bbs.huaweicloud.com/blogs/0a1a862f412611e89fc57ca23e93a89f    ServiceComb的开放性设计: https://bbs.huaweicloud.com/blogs/1fc9427c088611e89fc57ca23e93a89f    ServiceComb微服务开发框架介绍: https://bbs.huaweicloud.com/blogs/ad88f16dd98511e8bd5a7ca23e93a891    基于CSE的微服务架构实践-基础架构: https://bbs.huaweicloud.com/blogs/8bb2c3b8366c11e9bd5a7ca23e93a891    基于CSE的微服务架构实践-轻量级架构技术选型: https://bbs.huaweicloud.com/blogs/1be7166e371511e9bd5a7ca23e93a891    基于CSE的微服务架构实践-Spring Boot技术栈选型: https://bbs.huaweicloud.com/blogs/eca98a6f399a11e9bd5a7ca23e93a891    基于CSE的微服务架构实践-Spring Cloud技术栈选型: https://bbs.huaweicloud.com/blogs/e8e3deb63f1311e9bd5a7ca23e93a891    基于CSE的微服务工程实践-以契约为中心: https://bbs.huaweicloud.com/blogs/c998f257673711e9bd5a7ca23e93a891    基于CSE的微服务工程实践-Native API先行: https://bbs.huaweicloud.com/blogs/7c03a4793cd011e9bd5a7ca23e93a891    单体应用微服务改造实践: https://bbs.huaweicloud.com/blogs/17ad483f325f11e9bd5a7ca23e93a891    如何进行微服务的多环境开发部署: https://bbs.huaweicloud.com/forum/thread-11095-1-1.html    使用CSE实现滚动升级零中断: https://bbs.huaweicloud.com/blogs/72a312f09c8911e89fc57ca23e93a89f
  • 华为云微服务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文件报错,如下图所示。
总条数:274 到第
上滑加载中