spring-cloud的一些坑

本文详细讲述了在使用Spring Cloud、Nacos和OpenFeign时遇到的版本冲突、配置问题,包括去除Ribbon、修复OpenFeign启动错误、配置熔断及Sentinel的版本调整。最后总结了版本选择和配置最佳实践。
摘要由CSDN通过智能技术生成

版本

<!--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了。不用指定组件的版本,就按默认

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值