-
,
-
可以的。CSE用的slf4j, 只是一个适配层, 是否支持动态配置取决于业务实际采用的实现,比如log4j, logback等配合CSE的动态配置机制,增加一个配置项,业务监听配置项变更,就可以实现动态修改日志级别了CSE的动态配置机制参考: https://docs.servicecomb.io/java-chassis/zh_CN/config/general-config.html
-
-
cse对webscoket支持吗?cse服务引入了websocket,但连接总是报服务找不到。把cse去处,纯粹用spring-boot的启动服务端,websocket连接可用。
-
认证鉴权的时候,通常会获取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
-
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指定了不同的路径。
-
下载了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.程序直接终止运行。 求大神指点附错误日志
-
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 重试机制 重试机制流程,如下图
-
问题说明:有些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会给逗号也转码,这里供参考)
-
以下以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
-
如果接入mesher遇到以下错误:(如遇到非以下错误也请检查一下以下配置,也许也能解决问题)或者其他关于mesher都检查以下文件内容是否和以下一致:获取IP:windows使用ipconfigLinux使用 ifconfig
-
相信不少同学在使用 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的服务契约,之后不再动态刷新的
-
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
-
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
-
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签