-
昨天有两个同学碰到CSEJavaSDK开发的demo服务跑不起来的问题,错误日志如下图,报找不到javax.xml.ws.Holder:碰到找不到类的问题,我们一般下意识都认为是maven的依赖导入有问题,但是这个类不是通过maven依赖导入的,仔细检查一下可以发现它是jre里提供的,通常不可能找不到的。经过沟通后发现问题的原因是Java版本不对,当前 CSEJavaSDK/ServiceComb-Java-Chassis 支持的是Java8,而这两位同学使用的是其他版本的Java。后续如果有人碰到找不到javax.xml.ws.Holder类的问题可以参考这个检查一下。
-
从我们目前已知的情况, 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-samplespring boot1和spring boot2相关的pom依赖说明参考: https://huaweicse.github.io/cse-java-chassis-doc/using-cse-in-spring-boot/spring-boot-2.html
-
微服务之间权限管控解决办法有,采用服务账号(SPIFFE ),采用用户身份,对于第三方系统访问系统内部微服务还有API token、Oauth等方式,华为云CSE服务有为客户提供相关功能么
-
定义了如下接口: @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则没这个限制。
-
文件上传下载的开发文档参考: * 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); }
-
CSE提供了RPC和RestTemplate两种方式访问服务端,提供了丰富一致的开发治理能力, 如果能够访问第三方就更加方便了。 CSE也提供了访问第三方的机制。 由于CSE访问服务端,需要事先知道契约, 而第三方没有契约; 另外一个问题是第三方的地址不是通过服务中心发现的。因此访问第三方需要解决如下几个问题:声明契约: @Path("/rest/it-producer/v1/dataTypeJaxrs") interface DataTypeJaxrsSchemaIntf { @Path("intPath/{input}") @GET int intPath(@PathParam("input") int input); @Path("intQuery") @GET int intQuery(@QueryParam("input") int input); @Path("intHeader") @GET int intHeader(@HeaderParam("input") int input); @Path("intCookie") @GET int intCookie(@CookieParam("input") int input); @Path("intForm") @POST int intForm(@FormParam("input") int input); @Path("intBody") @POST int intBody(int input); @Path("intAdd") @GET int intAdd(@QueryParam("num1") int num1, @QueryParam("num2") int num2); //strinnum1 @Path("stringPath/{input}") @GET String stringPath(@PathParam("input") String input); @Path("stringQuery") @GET String stringQuery(@QueryParam("input") String input); @Path("stringHeader") @GET String stringHeader(@HeaderParam("input") String input); @Path("stringCookie") @GET String stringCookie(@CookieParam("input") String input); @Path("stringForm") @POST String stringForm(@FormParam("input") String input); @Path("stringBody") @POST String stringBody(String input); @Path("stringConcat") @GET String stringConcat(@QueryParam("str1") String str1, @QueryParam("str2") String str2); }声明/注册访问地址和协议 String endpoint = "rest:23.3.3.3:8080?sslEnabled=false"; RegistryUtils.getServiceRegistry() .registerMicroserviceMappingByEndpoints( THIRD_PARTY_MICROSERVICE_NAME, "1.2.1", Collections.singletonList(endpoint), DataTypeJaxrsSchemaIntf.class); MicroserviceInstance instance = new MicroserviceInstance(); instance.setEndpoints(Collections.singletonList(endpoint)); RegistryUtils.getServiceRegistry() .registerMicroserviceMapping( ASYNC_THIRD_PARTY_MICROSERVICE_NAME, "1.1.1", Collections.singletonList(instance), DataTypeJaxrsSchemaAsyncIntf.class );这样就可以了。详细代码参考: https://github.com/apache/servicecomb-java-chassis/blob/master/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/thirdparty/Test3rdPartyInvocation.java
-
CSE主要提供了一个REST开发框架,没有像其他框架,比如tomcat等,将原生的HTTP接口公布出来,可以使用类似HttpServletResonse设置cookie。 那么CSE如何设置cookie了?具体有两种方式:通过网关(比如edge service进行设置。)这个需要网关开发者在登录流程里面处理。 这里有个例子可以参考: https://github.com/huaweicse/cse-java-chassis-samples/blob/master/HouseAppWithSpringBoot2/edge-service/src/main/java/com/huawei/cse/houseapp/edge/LoginDispatcher.java通过JS脚本来设置, 使用JS脚本调用认证接口,将session-id设置到cookie中。 这里有个例子可以参考: https://github.com/huaweicse/cse-java-chassis-samples/blob/master/porter/porter_lightweight/gateway-service/src/main/resources/ui/js/login.js
-
使用CSE开发时,都是通过microservice.yaml文件指定服务监听地址,比如: rest: address: 0.0.0.0:18083??sslEnabled=true但是使用0.0.0.0是监听所有网卡,在多网卡情况下,上报给服务中心地址就可能不正确,也可能有安全风险,所以我们应该在启动脚本中自动获取到ip地址,并设置给他,在这里我们可以通过环境变量的方式来传递。比如在start.sh脚本中使用如下代码:#!/bin/bashexport REST__HOST=`ifconfig eth0 | awk '/inet /{print $2}' | cut -d: -f2 | awk '{print $1}'`export SSL_ROOT=`pwd`/certificatesjava $CMDVAR -jar ./user-1.0.0.jar在microservice.yaml里面可以这么配置 rest: address: ${REST_HOST}:18083??sslEnabled=true
-
问题: CSE JAVA SDK开启ssl提供rest服务,证书路径平台默认是从哪儿读取的,我把server.p12和microservice.yaml放在一起,但是平台报keyStore [server.p12] file not exist, please check!解决: CSE的证书配置参考: https://docs.servicecomb.io/java-chassis/zh_CN/security/tls.html 读取的证书路径和ssl.sslCustomClass指定的实现类有关,具体逻辑是由这个类决定的。 默认情况下, 是从“当前目录”读取相关证书文件。
-
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使用vertx的HTTP实现,支持客户端TLS和服务端TLS。 使用openssl 加上配置项: ssl.engine: openssl即可。 文档参考: https://docs.servicecomb.io/java-chassis/zh_CN/security/tls.html
-
错误日志: 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包依赖也是可以的。
-
使用CSE JAVA SDK开发微服务,报告接口方法不存在,启动失败,查看接口实现,这些方法都是存在的。日志信息:java.lang.Error: swagger method %s not exist in producer at org.apache.servicecomb.swagger.engine.SwaggerEnvironment.createProducer有些版本报错:java.lang.Error: swagger method %s not exist in producer %s. at org.apache.servicecomb.swagger.engine.SwaggerEnvironment.createProducer原因分析: 这个错误在比较swagger的方法是否在定义的接口实现里面存在,对于服务端,swagger的方法是根据接口实现生成的,因此任何时候都是存在的,正常情况下不会出现这个异常。 当用户将一个接口定义的schemaId指定为一样的,并且两个实现方法不一样的时候,就会出现这样的问题。 比如: @RestSchema(schemaId="xyz") public class Hello @RestSchema(schemaId="xyz") public class World
-
问题详细描述: CSE 服务中心要多长时间判定认为实例故障下线而移除了。 微服务和服务中心之间存在心跳机制,服务中心根据微服务定时发送的心跳来判断实例是否还在。 如果实例不存在了,那么服务中心会删除实例信息,并通知其他微服务实例(或者依赖于pull机制),告知这个实例已经下线。 服务中心移除实例的时间受几个参数控制 servicecomb.service.registry.instance.healthCheck.interval 和 servicecomb.service.registry.instance.healthCheck.times 。 当连续第times+1次心跳仍然失败时则实例被sc下线。即interval * (times + 1)决定了实例被自动注销的时间。如果服务中心等待这么长的时间没有收取到心跳,会注销实例。详细配置参考: https://docs.servicecomb.io/java-chassis/zh_CN/general-development/visit-sc.html
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第三期2026/08/21 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;念擎-华为云AI开发者运营案例开发专家
本期直播内容:AI六层能力首次详细解读 + 新一代华为云开发者空间亮相 + 校园案例直播带练
回顾中
热门标签