springcloud集成阿里巴巴sentinel进行feign的熔断限流

pom.xml中引入sentinel依赖

首先在父工程中引入alibaba依赖管理


    <properties>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>        
        <alibaba-cloud.version>2.0.0.RELEASE</alibaba-cloud.version>
        ...
    </properties>
    
...

<!--依赖管理,用于管理spring-cloud的依赖,其中Finchley.RELEASE是版本号-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>           
            <!-- 阿里 spring-cloud 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${alibaba-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

然后在具体springcloud微服务项目中引入 sentinel

        <!-- 阿里巴巴sentinel start  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- 阿里巴巴sentinel end  -->

application.yml配置

本文以订单模块调用商品微服务查询商品为例,OrderController通过GoodsFeign查询商品id对应的商品信息。具体代码如下:

在这里插入图片描述

订单微服务的application.yml配置如下

# feign开启sentinel支持
feign:
  sentinel:
    enabled: true
spring:
  cloud:
    # 阿里巴巴 sentinel 设置
    sentinel:
      eager: true #立即加载
      transport:
        # sentinel 控制台地址
        dashboard: localhost:8080
      datasource:
        # 限流规则的文件数据源配置
        ds1:
          file:
            file: classpath:flowrule.json
            data-type: json
            rule-type: flow
        # 熔断规则的文件数据源配置
        ds2:
          file:
            file: classpath:degraderule.json
            data-type: json
            rule-type: degrade
            

熔断和限流等规则可以用文件方式也可以直接在sentinel控制配置,区别是控制台配置方式会随微服务启动而重置清空。

熔断规则配置 degraderule.json

[
  {
    "resource": "GET:http://zmg-gds/goods/getGoodsById",
    "count": 1,
    "grade": 2,
    "timeWindow": 5
  }
]

以上规则代表资源 GET:http://zmg-gds/goods/getGoodsById 在单位时间内发生1次异常会触发熔断,并持续5秒钟。

GoodsFeign相关代码

GoodsFeign.java

/**
 * 用户 提供给其他服务调用的服务
 *
 * @author jacky
 */
@FeignClient(name = "zmg-gds", fallback = GoodsFeignFallback.class)
public interface GoodsFeign {

    /**
     * 根据商品ID查询商品
     *
     * @param id
     * @return
     */
    @GetMapping("/goods/getGoodsById")
    GoodsDTO getGoodsById(@RequestParam Long id);
}

sentinel完全兼容使用histrix进行feign熔断限流方式,只要在@FeignClient 中指定 fallback 对应的类即可,这个fallback类必须实现feign即可的相关方法,也就是熔断时返回给调用端为服务的降级消息。

GoodsFeignFallback.java

/**
 * 用户 提供给其他服务调用的服务
 *
 * @author jacky
 */
@Component
public class GoodsFeignFallback implements GoodsFeign {

    /**
     * 根据商品ID查询商品
     *
     * @param id
     * @return
     */
    @Override
    public GoodsDTO getGoodsById(@RequestParam Long id){
//        GoodsDTO goodsDTO = new GoodsDTO();
//        goodsDTO.setGoodsName("商品服务熔断降级");
//        return goodsDTO;
        return null;
    }
}

针对 feign的getGoodsById的熔断直接返回了null。

测试熔断

商品和订单为服务都正常启动时,调用订单中获取商品接口,返回商品信息是正常的。如下图:
在这里插入图片描述
sentinel控制台对订单中获取商品接口的资源监控图如下:
在这里插入图片描述
然后,我们关闭商品微服务,再访问订单中获取商品的接口,如下图,返回空白,且立即就返回了,不存在卡顿和超时情况(说明熔断降级起作用了,如果要直观可以改写下feign中的实现方法返回一个特殊名字的商品对象)。
在这里插入图片描述

此时,sentinel控制台监控信息如下:
在这里插入图片描述
最后再启动商品服务后,大概5秒后再访问订单获取商品接口,又会恢复正常。

另外,文件degraderule.json中配置的降级规则在下图中可以找到。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值