ServiceComb/CSE常见问题处理(1811)

本文档主要介绍了ServiceComb/CSE在使用中遇到的一些常见问题,包括操作URL重复错误、重试与隔离的判断标准、接口超时配置、重启失败的解决办法、契约稳定性、拦截器使用及会话粘滞策略。详细分析了错误原因,并提供了配置和代码示例。

一、operation with url /rest/cbc/cbcbianalysisservice/v1/applications/, method GET is duplicated.

这个错误一般发生在development环境。 在development情况下,CSE会检查契约是否有变化,有变化会覆盖、或者新增schema信息,但是删除的schema不会从服务中心删除。 当用户将Schema重命名,而且没有修改版本号,没有清理服务中心老版本历史数据的情况下就会可能出现这个异常。

在production环境(默认),不会出现这个问题,因为只要契约变化,production环境服务启动就会失败,不会将错误遗漏到运行环节。 

 

2018-11-26 08:27:20,530 [ERROR] [transport-vert.x-eventloop-thread-15] [org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions.safeSetInstances(MicroserviceVersions.java:163)] Failed to setInstances, appId=dev_alpha_auto, microserviceName=CBCMockBIAnalysisService.
org.apache.servicecomb.foundation.common.exceptions.ServiceCombException: operation with url /rest/cbc/cbcbianalysisservice/v1/applications/, method GET is duplicated.
        at org.apache.servicecomb.common.rest.locator.MicroservicePaths.addStaticPathResource(MicroservicePaths.java:81)
        at org.apache.servicecomb.common.rest.locator.MicroservicePaths.addResource(MicroservicePaths.java:57)
        at org.apache.servicecomb.common.rest.locator.ServicePathManager.addResource(ServicePathManager.java:121)
        at org.apache.servicecomb.common.rest.locator.ServicePathManager.addSchema(ServicePathManager.java:88)
        at org.apache.servicecomb.common.rest.RestEngineSchemaListener.onSchemaLoaded(RestEngineSchemaListener.java:54)
        at org.apache.servicecomb.core.definition.loader.SchemaListenerManager.notifySchemaListener(SchemaListenerManager.java:59)
        at org.apache.servicecomb.core.definition.loader.SchemaListenerManager.notifySchemaListener(SchemaListenerManager.java:48)
        at org.apache.servicecomb.core.definition.MicroserviceVersionMeta.<init>(MicroserviceVersionMeta.java:46)
        at org.apache.servicecomb.core.definition.MicroserviceVersionMetaFactory.create(MicroserviceVersionMetaFactory.java:38)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions.lambda$setInstances$0(MicroserviceVersions.java:182)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
        at org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx.computeIfAbsent(ConcurrentHashMapEx.java:56)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions.setInstances(MicroserviceVersions.java:180)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions.safeSetInstances(MicroserviceVersions.java:160)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions.pullInstances(MicroserviceVersions.java:155)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions.submitPull(MicroserviceVersions.java:127)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceManager.lambda$getOrCreateMicroserviceVersions$0(MicroserviceManager.java:55)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
        at org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx.computeIfAbsent(ConcurrentHashMapEx.java:56)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceManager.getOrCreateMicroserviceVersions(MicroserviceManager.java:53)
        at org.apache.servicecomb.serviceregistry.consumer.MicroserviceManager.getOrCreateMicroserviceVersionRule(MicroserviceManager.java:79)
        at org.apache.servicecomb.serviceregistry.consumer.AppManager.getOrCreateMicroserviceVersionRule(AppManager.java:67)
        at org.apache.servicecomb.edge.core.EdgeInvocation.findMicroserviceVersionMeta(EdgeInvocation.java:85)
        at org.apache.servicecomb.edge.core.EdgeInvocation.edgeInvoke(EdgeInvocation.java:68)
        at com.huawei.cbc.edgeservice.EdgeDispatcher.onRequest(EdgeDispatcher.java:98)
        at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:219)
        at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:120)
        at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:133)
        at org.apache.servicecomb.transport.rest.vertx.RestBodyHandler$BHandler.doEnd(RestBodyHandler.java:270)
        at org.apache.servicecomb.transport.rest.vertx.RestBodyHandler$BHandler.end(RestBodyHandler.java:251)
        at org.apache.servicecomb.transport.rest.vertx.RestBodyHandler.lambda$handle$0(RestBodyHandler.java:91)
        at io.vertx.core.http.impl.HttpServerRequestImpl.handleEnd(HttpServerRequestImpl.java:417)
        at io.vertx.core.http.impl.Http1xServerConnection.handleEnd(Http1xServerConnection.java:482)
        at io.vertx.core.http.impl.Http1xServerConnection.processMessage(Http1xServerConnection.java:456)
        at io.vertx.core.http.impl.Http1xServerConnection.handleMessage(Http1xServerConnection.java:144)

 

二、ServiceComb/CSE重试和隔离如何判断错误?

简单的描述:

1. 网络错误 + 503错误码等情况可以触发重试。

2. 网络错误 + 503错误码 + 超时等错误可以触发隔离。

细节内容可以参考代码:

Retry: https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/DefaultRetryExtensionsFactory.java

Isolation: https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java

   参考isFailedResponse

关于隔离恢复:https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java

   参考allowVisit

内部线程只会触发快速隔离,不会触发恢复,参考: https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java

  里面的Timer线程

 

三、cse.request.timeout 怎么配置operation/schema级别的超时

CSE支持给每个接口调用单独设置超时时间。 格式为:

  cse.request.[microserviceName.[schemaid.[operationid.]]].timeout

比如: 

cse.request.timeout 所有接口

cse.request.testSerivce.timeout testService的所有接口

 

四、没修改代码,服务重启失败: The difference in local schema

问题现象:服务上次可以启动成功,重启后启动失败,或者换了一个机器启动失败,报告The difference in local schema

问题分析:这个是由于服务重启后生成的schema与上次启动不同。 这个问题比较隐蔽,通常发生在如下情况下:

业务定义了一个model,里面有些方法,比如isSucess, getIndex等,这些方法没有对应的属性,而只是用于控制的。 JVM在加载属性顺序是固定的,但是加载方法不固定,顺序可能会变化。 由于json会解析model里面的getter/setter方法,也把他们当成model。CSE会根据model生成契约,并检查契约的差异,不同的时候,必须修改版本号才能成功。 所以启动失败 。

对于这种场景,应该修改业务代码的model,将不是属性的字段什么味@JsonIgnore,或者进行适当的代码重构,服务的model尽可能指包含属性和getter/setter方法(POJO)。

还有一些情况,可能导致这种问题。业务以为定义的model的属性,但是由于属性不符合java bean规范,造成了额外的getter/setter方法。 

比如:

 private boolean isSuccess;

  public boolean isSuccess() {return isSuccess;}

这个例子将属性声明为isSuccess,实际应该为success。 

再比如这里的例子: https://bbs.huaweicloud.com/forum/thread-11107-1-1.html

一些特殊的属性名,生成的getter/setter不符合java bean规范。

 关于从Pojo提取契约的说明

规则
1.通用规则
http://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/
实践上来说,简单地满足下面的规则就ok了:
(下面的用法有的是合法的,但是为了简单清晰,最好也不要用)
a.boolean不要以is开头,比如isEnable,应该直接命名enable
b.使用驼峰命名,但是不使用“奇特”的用法,比如pName/iValue/Name/NAME等等
2.CSE规则
主要针对:没有field对应的getter/setter
a.如果不属于契约范围,则需要使用@JsonIgnore标记为忽略
  不考虑CSE契约,普通的RESTful,如果不加忽略标记,看似能跑,但是网络上传输了不期望的数据,这也是一个不健康的状态
b.如果属于契约范围,则需要使用@JsonPropertyOrder指定这些虚拟properties的顺序
  以避免因为java反射获取method列表的无序性导致契约不稳定
  
CSE规则的背景
契约是CSE的核心,这一块不再重复描述
1.如果业务未提供契约,则CSE需要根据业务Schema类生成契约
  生成契约直接依赖swagger从Pojo提取契约model的能力
  swagger依赖jackson从Pojo提取properties的能力
  jackson以及业界很多组件,将public field/getter/setter均看作是properties
2.根据java规范,反射获取method列表的顺序是未定义的,每次获取的结果可能不相同
  所以对于没有field,仅仅只有getter/settter的这些虚拟properties,jackson提取出来的顺序是不确定的
3.CSE要求同一个微服务的同一个版本,其契约是一致的,否则无论从哪个层面的语义上都是说不通的
  这不是仅仅是一个序列化问题,而是对外呈现的契约是否一致的问题

对于getter/setter定义错误的情况,比如:

private boolean isSuccess;

public boolean isSuccess() {return isSuccess;}

这个问题在开发调试的可能比较难于发现,因为一台机器的顺序可能是不变的。当换一台测试机器的时候,就容易暴露出来。

 

五、如何使用拦截器

原来的Spring MVC代码使用如下方式使用拦截器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

@Configuration

public class DemoConfig extends WebMvcConfigurerAdapter {

 

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new HandlerInterceptor() {

 

            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

                System.out.println("11111");

                return true;

            }

 

            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

 

            }

 

            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

 

            }

 

        });

    }

 

}

切换CSE以后不生效。

这种方式是Spring MVC的方式,CSE提供了类似的方式,CSE有Handler、HttpServerFilter等机制可以替换使用。https://bbs.huaweicloud.com/blogs/02de5f11cb6e11e8bd5a7ca23e93a891介绍了Spring MVC的运行时和CSE的运行时差异. Handler, HttpServerFilter机制开发指南参考: https://docs.servicecomb.io/java-chassis/zh_CN/general-development/http-filter.html 和 https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/intruduction.html

 

六、not allowed multi path for com.huawei.iam.cache.controller.AgencyController:getAgency

java.lang.Error: generate operation swagger failed, com.huawei.iam.cache.controller.AgencyController:getAgency

 

generate operation swagger failed, com.huawei.iam.cache.controller.AgencyController:getAgency

 

java.lang.Error: not allowed multi path for com.huawei.iam.cache.controller.AgencyController:getAgency

 

说明: 

CSE不允许一个接口定义多个path,比如:

1

2

3

4

5

@RequestMapping(value = {"/v3-ext/agencies""/v3-huawei/agencies""/v3.0/OS-AGENCY/agencies"},

                method = RequestMethod.GET, produces = "application/json;charset=UTF-8")

public Map<String, Object> listAgency(@RequestParam("domain_id") String domainId,

                                      @RequestParam(value = "name", required = false) String name,

                                      HttpServletRequest request) throws BadRequestException {

CSE不允许一个接口定义多个path,因为每个接口必须存在唯一的operation id。 这种情况需要将接口拆分为3个接口,比如listAgency1, listAgency2, listAgency3. 

 

 

七、如何在微服务之间配置和使用会话粘滞策略

场景描述:

一个客户登录后,始终把请求发送到某一个实例。当第一次访问这个实例的时候,需要记录会话ID对应的实例是A,这个会话下次发起同样的请求的时候,仍然访问A。

CSE提供的会话粘滞:

CSE并没有提供上述场景的会话粘滞策略实现。因为一个系统的会话管理是多样的,CSE框架并不知道如何标记一个请求属于哪个会话。

CSE提供了一个简化的会话粘滞实现,保证对于一个接口的访问,尽可能发送到上一次访问的实例,负载均衡策略名字为SessionStickiness,修改负载均衡策略参考https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.html。

如果用户需要实现“场景描述”里面的会话粘滞策略,需要考虑自定义负载均衡策略,实现相关接口即可。详细可以参考SessionStickiness、RoundRobin等CSE自带的负载均衡的策略实现。

 八、连接服务中心websocket接口失败

错误日志:

2018-11-06 07:46:59,746 ERROR [registry-vert.x-eventloop-thread-2][][http.ServiceRegistryClientImpl 688] watcher connect to service center server failed, microservice 19a50f38e0f411e8b1c30255ac105523, Websocket connection attempt returned HTTP status code 404

问题原因:

在公有云环境下,服务调用是经过网关的,不支持使用websoket,在这种场景下,使用pull机制来更新实例。 需要设置如下参数:

cse:
 service:
   instance:
     watch: false #使用API网关访问,只能使用PULL模式

公有云环境连接服务中心的说明参考:

https://huaweicse.github.io/cse-java-chassis-doc/servicecomb-using-cse/connect-service-center.html

<think>好的,用户现在问的是FSE、CSE和PSE这三个缩写的含义和区别。首先,我需要先确定这三个缩写在不同领域的可能含义,因为计算机领域的缩写往往有很多不同的解释。 根据用户提供的引用内容,用户之前提到了计算机缩写术语,比如ECC、SET、WAPI,以及一些存储相关的术语如ATAPI、CDRW等。但用户提供的引用中并没有直接提到FSE、CSE或PSE这三个缩写,所以需要依靠我的知识库来推断可能的含义。 首先,FSE在计算机领域常见的含义可能有几种: 1. **File System Event**:文件系统事件监控,用于实时跟踪文件变化。 2. **Fast Software Encryption**:软件加密领域的会议或技术。 3. **Finite State Machine**:有限状态机,但缩写通常是FSM,不太可能是FSE。 4. **Full Screen Editor**:在某些旧系统中可能指全屏编辑器。 接下来是CSE: 1. **Computer Science and Engineering**:计算机科学与工程,学术领域的专业名称。 2. **Common Subexpression Elimination**:编译器优化技术中的公共子表达式消除。 3. **Cybersecurity Engineer**:网络安全工程师,但通常不是缩写为CSE。 4. **Control Systems Engineering**:控制系统工程,但更常见于工程领域。 然后是PSE: 1. **Packet Switching Exchange**:分组交换设备,网络设备的一种。 2. **Problem Statement Editor**:在某些编程工具中的问题陈述编辑器。 3. **Power Supply Efficiency**:电源效率标准,如80 PLUS认证中的不同级别。 4. **Programmable System-on-Chip (PSoC)**:但PSE可能不是标准缩写。 不过,用户之前的问题和引用主要集中在加密、安全电子交易、存储技术等方面,所以可能需要结合这些领域来考虑。例如,用户提到了椭圆曲线加密(ECC)、安全电子交易(SET)、WAPI等,可能与安全相关的缩写更相关。 另外,用户提供的引用3中提到了很多存储相关的术语,如ATAPI、CDRW、CLV等。因此,FSE、CSE、PSE是否与存储或文件系统有关? 再仔细想想,FSE可能与文件系统相关,如File System Encryption(文件系统加密),但用户提到的引用1中有加密术语ECC,可能FSE在这里是另一种加密技术?不过常见的加密缩写如AES、RSA、ECC等,FSE并不常见。 或者,在用户提到的引用2中,有关于Java密钥库的操作,可能与安全或证书相关,但CSE可能指证书相关的术语? 另外,可能需要考虑这三个缩写是否属于同一类别或领域。例如,如果都是加密标准、存储协议或网络设备,那么它们的定义和区别会更相关。 再检查是否有其他可能性。例如,在软件开发中,CSE可能指Client-Side Encryption(客户端加密),而PSE可能指Platform Security Environment(平台安全环境),但这些都是推测。 考虑到用户引用的内容中有WAPI(无线局域网鉴别与保密基础架构),可能与网络协议或安全架构相关,因此FSE、CSE、PSE是否属于类似的协议或架构? 或者,用户可能指的是特定厂商或标准中的术语,例如Intel处理器的P-cores和E-cores中的PSE?不过这可能不太相关。 另外,用户可能是在某个特定上下文中看到这三个缩写,比如在某个文档或技术规范中,但由于信息有限,需要尽可能覆盖常见解释。 总结可能的解释: - **FSE**:File System Event、Fast Software Encryption、Full Screen Editor。 - **CSE**:Common Subexpression Elimination、Computer Science and Engineering、Client-Side Encryption。 - **PSE**:Packet Switching Exchange、Power Supply Efficiency、Problem Statement Editor。 接下来需要确定最可能的解释,并说明它们的区别。由于用户之前的问题涉及加密和存储,可能更倾向于安全或系统相关的解释。 例如: - **FSE (Fast Software Encryption)**:软件加密技术,专注于快速实现加密算法。 - **CSE (Common Subexpression Elimination)**:编译器优化技术,用于提高代码效率。 - **PSE (Packet Switching Exchange)**:网络设备,用于数据包交换。 或者,如果都是安全相关的: - **FSE (File System Encryption)**:文件系统级加密。 - **CSE (Client-Side Encryption)**:在客户端进行数据加密。 - **PSE (Platform Security Environment)**:提供安全执行环境的平台。 需要指出这些缩写的不同领域应用,并说明它们的区别。同时,如果某些缩写有多个常见含义,也需要分别列出,避免误导用户。 最后,确保回答结构清晰,分点说明每个缩写的定义、应用场景及区别,并引用用户提供的引用内容中的相关部分,如加密技术(引用1)、安全交易(引用1)等,以增强回答的相关性。</think>### FSE、CSE与PSE的定义及区别解析 #### 一、**FSE(Fast Software Encryption)** **定义**: FSE指**快速软件加密技术**,专注于在通用计算设备上高效实现加密算法(如AES、ChaCha20等),平衡安全性与性能需求[^1]。 **核心特征**: - 算法优化:通过SIMD指令集或查表加速加密运算 - 低延迟:适用于实时通信(如TLS握手优化) - 资源占用少:适合嵌入式系统或移动设备 **典型应用**: - 物联网设备数据传输加密 - 移动端即时通讯消息保护 --- #### 二、**CSE(Common Subexpression Elimination)** **定义**: CSE是**编译器优化技术**,用于消除代码中的重复计算表达式,提升程序执行效率[^2]。 **实现原理**: - **静态分析**:识别重复表达式(如循环内的固定计算) - **结果复用**:将重复表达式计算结果存入临时变量 **代码示例**: ```c // 优化前 a = (x + y) * 10; b = (x + y) * 5; // 优化后(CSE应用) temp = x + y; a = temp * 10; b = temp * 5; ``` **应用场景**: - 高性能计算代码优化 - 嵌入式系统资源受限环境 --- #### 三、**PSE(Packet Switching Exchange)** **定义**: PSE指**分组交换设备**,是网络通信中负责数据包路由与转发的核心组件(如路由器、交换机)[^3]。 **核心功能**: - **路由决策**:根据IP头部信息选择传输路径 - **流量控制**:通过QoS策略管理带宽分配 - **错误检测**:利用CRC校验保障数据完整性 **技术对比**: | 特性 | PSE(分组交换) | 电路交换 | |--------------------|----------------------|-----------------------| | **连接方式** | 无连接 | 面向连接 | | **资源占用** | 动态分配 | 固定预留 | | **适用场景** | 互联网数据传输 | 传统电话网络 | --- #### 四、**三者的核心区别** | 维度 | FSE(加密技术) | CSE(编译器优化) | PSE(网络设备) | |--------------|-------------------------------|-----------------------------|-----------------------------| | **领域** | 信息安全 | 软件工程 | 网络通信 | | **功能目标** | 数据保密性与处理速度 | 代码执行效率提升 | 数据包高效路由与传输 | | **实现层级** | 应用层/传输层 | 编译器中间代码优化 | 网络层/数据链路层 | | **典型工具** | OpenSSL加密库 | GCC/LLVM编译器 | Cisco路由器、Juniper交换机 | --- ### 相关问题 1. 如何评估FSE中不同加密算法的性能差异?[^1] 2. CSE优化技术与其他编译器优化(如循环展开)如何协同工作?[^2] 3. 现代PSE设备如何支持SDN(软件定义网络)架构?[^3] 4. FSE在物联网安全中的具体实现案例有哪些? 通过以上分析,FSE、CSE与PSE分别对应**信息安全**、**软件性能优化**和**网络基础设施**三大技术领域,其核心差异体现在应用场景与底层实现目标上[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值