• [技术干货] 使用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类的问题可以参考这个检查一下。
  • [技术干货] CSE 支持接口响应序列化为JSON时过滤掉为null的字段吗?
    如题,想做一个动态查询的接口,要求响应是随着请求的字段动态变化的,所以考虑接口响应转为JSON时序列化掉为null的字段CSE 支持接口响应序列化为JSON时过滤掉为null的字段吗?
  • [技术干货] 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-samplespring boot1和spring boot2相关的pom依赖说明参考: https://huaweicse.github.io/cse-java-chassis-doc/using-cse-in-spring-boot/spring-boot-2.html
  • [技术干货] CSE服务提供哪些访问鉴权功能
    微服务之间权限管控解决办法有,采用服务账号(SPIFFE ),采用用户身份,对于第三方系统访问系统内部微服务还有API token、Oauth等方式,华为云CSE服务有为客户提供相关功能么
  • [技术干货] 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 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);   } 
  • [技术干货] 使用CSE的RpcReference或者RestTemplate如何访问第三方应用?
    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如何设置cookie
    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在脚本中指定服务监听地址
    使用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开启ssl提供rest服务,证书路径平台默认是从哪儿读取的
    问题:    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版本号规则
    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 和 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包依赖也是可以的。 
  • [技术干货] CSE 服务启动的时候报告接口方法不存在,启动失败
    使用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
  • [技术干货] Servicestage CSE,对于服务实例故障的感知时长,需要多久
    问题详细描述: 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
总条数:274 到第
上滑加载中