建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

橘色祥云楼...

发帖: 202粉丝: 38

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2017-11-14 08:57:56 6510 楼主 显示全部楼层
[行业前沿] 【ServiceComb最全 FAQ】 42个常见问题 大集锦2

  • Q: swagger body参数类型定义错误,导致服务中心注册的内容没有类型信息

    现象描述:

    定义如下接口,将参数放到body传递

     /testInherate:
         post:
           operationId: "testInherate"
           parameters:
           - in: "body"
             name: "xxxxx"
             required: false
             type: string
           responses:
             200:
               description: "response of 200"
               schema:
                 $ref: "#/definitions/ReponseImpl"
    

    采用上面方式定义接口。在服务注册以后,从服务中心查询下来的接口type: string 丢失,变成了:

     /testInherate:
         post:
           operationId: "testInherate"
           parameters:
           - in: "body"
             name: "xxxxx"
             required: false
           responses:
             200:
               description: "response of 200"
               schema:
                 $ref: "#/definitions/ReponseImpl"
    

    如果客户端没有放置swagger,还会报告如下异常:

        Caused by: java.lang.ClassFormatError: Method "testInherate" in class ? has illegal signature "
    

    A:定义body参数的类型的时候,需要使用schema,不能直接使用type。

     /testInherate:
         post:
           operationId: "testInherate"
           parameters:
           - in: "body"
             name: "request"
             required: false
             schema:
               type: string
           responses:
             200:
               description: "response of 200"
               schema:
                 $ref: "#/definitions/ReponseImpl"
    
  • Q: ServiceComb微服务框架服务调用是否使用长连接?

    A: http使用的是长连接(有超时时间),highway方式使用的是长连接(一直保持)。

  • Q: 服务断连服务中心注册信息是否自动删除

    A: 服务中心心跳检测到服务实例不可用,只会移除服务实例信息,服务的静态数据不会移除。

  • Q: 如果使用tomcat方式集成ServiceComb微服务框架,如何实现服务注册

    A: 如果使用cse sdk servlet方式(使用transport-rest-servlet依赖)制作为war包部署到tomcat,需要保证,服务描述文件(microservice.yaml)中rest端口配置和外置容器一致才能实现该服务的正确注册。否则无法感知tomcat开放端口。

  • Q: 如果使用tomcat方式集成CSE微服务框架,服务注册的时候如何将war包部署的上下文注册到服务中心

    A: 发布服务接口的时候需要将war包部署的上下文(context)放在baseurl最前面,这样才能保证注册到服务中心的路径是完整的路径(包含了上下文)。实例:

     @path(/{context}/xxx)
     class ServiceA
    
  • Q: ServiceComb微服务框架如何实现数据多个微服务间透传

    A: 透传数据塞入:

     CseHttpEntity<xxxx.class> httpEntity = new CseHttpEntity<>(xxx);
     //透传内容
     httpEntity.addContext("contextKey","contextValue");
     ResponseEntity<String> responseEntity = RestTemplateBuilder.create().exchange("cse://springmvc/springmvchello/sayhello",HttpMethod.POST,httpEntity,String.class);
    

    透传数据获取:

     @Override
     @RequestMapping(path="/sayhello",method = RequestMethod.POST)
     public String sayHello(@RequestBody Person person,InvocationContext context){
       //透传数据获取
       context.getContext();
       return "Hello person " + person.getName();
     }
    
  • Q: ServiceComb微服务框架服务如何自定义返回状态码?

    A:

     @Override
     @RequestMapping(path = "/sayhello",method = RequestMethod.POST)
     public String sayHello(@RequestBody Person person){
       InvocationContext context = ContextUtils.getInvocationContext();
       //自定义状态码
       context.setStatus(Status.CREATED);
       return "Hello person "+person.getName();
     }
    
  • Q: ServiceComb body Model部分暴露

    A: 一个接口对应的body对象中,可能有一些属性是内部的,不想开放出去,生成schema的时候不要带出去,使用:

     @ApiModelProperty(hidden = true)
    
  • Q: ServiceComb框架获取远端consumer的地址

    A: 如果使用http rest方式(使用transport-rest-vertx依赖)可以用下面这种方式获取:

     AbstractProducerContextArgMapper httpRequestCreator = (AbstractProducerContextArgMapper)invocation.getHandlerContext().get(RestConst.HTTP_REQUEST_CREATOR);
     if(httpRequestCreator != null){
       HttpServletRequest req = (HttpServletRequest)httpRequestCreator.createContextArg(invocation);
       System.out.println(req.getRemoteHost());
     }
    

    实际场景是拿最外层的地址,所以应该是LB传入到edgeservice,edgeService再放到context外下传递。

  • Q: ServiceComb不支持泛型

    A: 明确不支持,需要修改接口,接口修改后需要修改版本号,以免consumer还是使用旧的版本。

  • Q: ServiceComb对handler描述

    A: consumer默认的handler是simpleLB,没有配置的时候handler链会使用这个,如果配置了handler,里面一定要包含lb的handler,否则调用报错,需要在文档里面进行说明。

回复 举报
分享

分享文章到朋友圈

分享文章到微博

艾弗森

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-10-10 19:28:30 沙发 显示全部楼层

http使用的是短连接

image.png

点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册