一、SpringCloud Alibaba Sentinel整合SpringCloud OpenFeign,启动报错
FactoryBean threw exception on object creation; nested exception is java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata(Ljava/lang/Class;)Ljava/util/List;
二、报错原因是版本问题
Spring Cloud Alibaba (2.2.1.RELEASE) 引入的是旧版本的 OpenFeign(2.2.1.RELEASE) 方法,而 Sentinel(2.2.1.RELEASE) 中的 SentinelContractHolder 类调用的是新版本的 OpenFeign(2.2.2.RELEASE) 方法。
OpenFeign 版本 | 方法名 |
---|---|
< 2.2.1.RELEASE | parseAndValidatateMetadata |
>= 2.2.2.RELEASE | parseAndValidateMetadata |
所以,Sentinel 框架 SentinelContractHolder 类中找不到 parseAndValidatateMetadata 这个方法,是因为这个方法拼写有错误,在 Sentinel 和 OpenFeign 新版本中已经修正为 parseAndValidateMetadata。
三、解决办法
- 解决版本差异问题
- 覆盖SentinelContractHolder类,使其继续调用旧版parseAndValidatateMetadata方法
在项目模块中新建包:com.alibaba.cloud.sentinel.feign
然后添加如下类:
package com.alibaba.cloud.sentinel.feign;
import feign.Contract;
import feign.MethodMetadata;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SentinelContractHolder implements Contract {
private final Contract delegate;
/**
* map key is constructed by ClassFullName + configKey. configKey is constructed by {@link
* feign.Feign#configKey}
*/
public final static Map<String, MethodMetadata> METADATA_MAP = new HashMap<>();
public SentinelContractHolder(Contract delegate) {
this.delegate = delegate;
}
@Override
public List<MethodMetadata> parseAndValidatateMetadata(Class<?> targetType) {
List<MethodMetadata> metadatas = delegate.parseAndValidatateMetadata(targetType);
metadatas.forEach(metadata -> METADATA_MAP
.put(targetType.getName() + metadata.configKey(), metadata));
return metadatas;
}
}