CSE/ServiceComb 和 Spring Boot集成的时候报告Hystrix重复错误

本文解析了SpringBoot中Hystrix重复注册导致的IllegalStateException异常,详细介绍了错误原因及解决方案,包括调整配置文件避免Bizkeeper重复注册,以及通过断点调试定位具体模块。

错误日志:

  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基于ServiceComb提供微服务框架,且DubboJava chassis底层都使用了Spring的依赖注入bean管理系统,所以使用Dubbo的服务迁移到ServiceComb工作量较小,主要改动在依赖配置方面。而Seata是一个开源的分布式事务解决方案。以下是集成CSEServiceComb)、DubboSeata的大致方法: #### 依赖配置 在项目的`pom.xml`文件中添加相关依赖。 ```xml <!-- CSEServiceComb)依赖 --> <dependency> <groupId>com.huaweicloud</groupId> <artifactId>cse-sdk-all</artifactId> <version>最新版本号</version> </dependency> <!-- Dubbo依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>对应的版本号</version> </dependency> <!-- Seata依赖 --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-all</artifactId> <version>对应的版本号</version> </dependency> ``` #### 服务提供方配置 如果是服务提供方,需要进行如下配置改动。 - **替换依赖**:将Dubbo相关依赖替换为CSEServiceComb)相关依赖,同时保留必要的Dubbo配置以实现平滑过渡。 - **配置文件**:在配置文件中添加CSEServiceCombSeata的相关配置。例如,在`application.properties`或`application.yml`中配置CSE的服务注册中心地址、Seata的事务组等信息。 ```properties # CSE服务注册中心地址 cse.service.registry.address=http://127.0.0.1:30100 cse.service.name=my-service # Seata相关配置 seata.tx-service-group=my_tx_group seata.service.vgroup-mapping.my_tx_group=default ``` #### 服务调用方配置 服务调用方同样要进行依赖替换配置调整。在调用服务时,需要使用CSEServiceComb)的服务发现机制来定位服务,同时结合Seata实现分布式事务管理。 #### Seata配置 需要启动Seata Server,并根据业务需求配置Seata的事务模式(如AT、TCC等)。在应用中添加Seata的全局事务注解,确保业务逻辑在分布式事务的管理下执行。 ```java import io.seata.spring.annotation.GlobalTransactional; import org.springframework.stereotype.Service; @Service public class MyService { @GlobalTransactional public void businessMethod() { // 业务逻辑 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值