版本
<!--spring-cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud-alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--boot版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
nacos和openfeign的坑
在使用nacos和openfeign时,openfeign会与nacos中带的ribbon冲突,所以移除nacos中的ribbon。
报的错是
java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;)Lorg/springframework/cloud/client/ServiceInstance;
这个比较的坑,很容易在这上面花费大量时间,将ribbon从nacos中移除即可
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.7.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
openfeign启动报错的坑
这个还算良心,会直接在控制台打印具体信息,提示需要依赖spring-cloud-starter-loadbalancer
java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
引入spring-cloud-starter-loadbalancer即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
openfeign熔断的配置的坑
如果设置了fallback但是调用失败并没有进行熔断,报的错如下
feign.FeignException$InternalServerError: [500] during [GET] to [http://service-pay/pay/getUserMoney/3]
这时需要在配置文件中配置feign.circuitbreaker.enabled=true,而不是网上流传的feign.hystrix.enabled=true
还要加入hystrix的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@FeignClient的fallbackFactory可指定如何进行熔断。不过这种fallbackFactory较为麻烦,就用fallback统一进行熔断就好了,除非是有特别需求。
@Component
public class PayFeignServiceFallbackFactory implements FallbackFactory<PayFeignService> {
@Autowired
PayFeignServiceImpl payFeignService;
@Autowired
PayFeignServiceImpl.PayFeignServiceImpl$503 payFeignServiceImpl$503;
@Override
public PayFeignService create(Throwable cause) {
// 根据异常的信息,返回不同的熔断策略
if(cause instanceof FeignException){
int status = ((FeignException) cause).status();
if(status==503){
//比如503(服务找不到)
return payFeignServiceImpl$503;
}
}
return payFeignService;
}
}
sentinel和openfegin的坑
启动报错无法找到类feign.hystrix.FallbackFactory。
Caused by: java.lang.ClassNotFoundException: feign.hystrix.FallbackFactory
解决办法:降低openfegin的版本为2.2.6.RELEASE或其他版本
但是!!! 我切换后确实解决了问题,可是当我想再复现bug时,发现复现不出来了。不知什么原因。
现在依然是3.1.0版本的spring-cloud-starter-openfeign和2021.1的spring-cloud-alibaba-dependencies里头的sentinel,没出现问题。就很奇怪,刚刚还有问题的。
而且发现了个很有意思的现象,在sentinel dashboard上看到这次的sentinel客户端版本居然不同了。。
观看之前的日志,发现之前用的是2.2.7.RELEASE版本的sentinel
但是我手动修改pom中alibaba版本为2.2.7.RELEASE,bug还是没有复现。sentinel-client的版本变成了1.8.1,之前alibaba版本为2021.1时还是1.8.0的
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
于是我起了两个不同版本的alibaba,上面的是2.2.7.RELEASE,用的sentinel-client的版本居然比为2021.1版本的还要高,下面的是2021.1,sentinel-client的版本是1.8.0,这波是反向升级?
总结:按照第一段中版本使用就ok了。不用指定组件的版本,就按默认