搜索
简帛阁>技术文章>SpringCloud Alibaba Sentinel整合 ribbon + open-feign + fallback 进行服务熔断。

SpringCloud Alibaba Sentinel整合 ribbon + open-feign + fallback 进行服务熔断。

注意,之前在降级中的配置:blockHandler = "deal_testHotKey"只是对违背了限流规则的请求设置的兜底方法。如果方法内部调用异常,还是会展现给前端错误页面,很不友好

配置服务熔断对应方法

@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")


所以才需要整合open-feign 来解决程序内部异常时,配置相应的兜底方法。即在@SentinelResource配置fallback属性进行指定我们的程序内部调用出错时的兜底方法

如下配置了@SentinelResource的fallback属性,因此如果抛出异常就会执行fallback = "handleFallback"指定的方法,而不会返回一个用户看不懂的错误页面

@GetMapping("/consutomer/payment/get/{id}")
    @SentinelResource(value = "fallback", fallback = "handleFallback") //fallback只处理业务异常
    public CommonResult getPayment(@PathVariable("id")Long id){<!-- -->
        if(id >= 4){<!-- -->
            throw new IllegalArgumentException("非法参数异常...");
        }else {<!-- -->
            return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
        }
    }

    //兜底方法
    public CommonResult handleFallback(@PathVariable("id")Long id, Throwable e){<!-- -->
        return new CommonResult(414, "---非法参数异常--", e);
    }

注意:如果blockHandler 和fallback 都指定,那么不论是违背了限流规则,还是程序内部出错,都不会返回错误页面给用户

Sentinel整合Ribbon

1,加入对应的pom依赖
2,注入 Resttemplate:

@Configuration
public class ApplicationContextConfig {<!-- -->
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){<!-- -->
        return new RestTemplate();
    }
}

3,提供两个服务名一样的提供者,并注册进nacos注册中心
4,消费者配置集nacos,被sentinel监控

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719  # 默认8719 ,如果端口被占用,端口号会自动 +1,提供给 sentinel 的监控端口
management:
  endpoints:
    web:
      exposure:
        include: '*'
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

异常忽略

配置了异常忽略的话,指定异常就不会被捕捉到

Sentinel整合openFeign进行全局熔断

上面是单个模块进行 fallback 和 blockhandler 的测试,下面是整合 openfeign 实现把降级方法解耦。和Hystrix 几乎一摸一样!

1,引入Feign的依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2,yml 追加如下配置:

# 激活Sentinel对Feign的支持
feign:
  sentinel:
    enabled: true

3, 主启动类添加注解 : @EnableFeignClients 激活open-feign

4,消费者要声明接口,表示调用提供方模块的哪个方法 :

@FeignClient(value = "nacos-payment-provider", fallback = PaymentServiceImpl.class)
public interface PaymentService {<!-- -->

    @GetMapping("/payment/get/{id}")
    public CommonResult paymentSql(@PathVariable("id")Long id);
}

5,实现上面的接口,实现熔断兜底:

@Component
public class PaymentServiceImpl implements PaymentService {

    @Override
    public CommonResult paymentSql(Long id) {
        return new CommonResult(414, "open-feign 整合 sentinel 实现的全局服务降级策略",null);
    }
}
注意,之前在降级中的配置:blockHandlerdeal_testHotKey只是对违背了限流规则的请求设置的兜底方法。如果方法内部调用异常,还是会展现给前端错误页面,很不友好配置服务熔断对应方法@
Sentine1背景Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。这
最近在学习阿里的Nacos组件以及Sentinel组件,折腾出了一个小demo。Git地址:https://githubcom/yangzhilong/nacosclient有兴趣的小伙伴可以参考下,
Feign的使用Feign也是网飞开发的,SpringCloud使用Feign非常简单,我下边演示一下:首先服务消费者这边肯定需要一个对应的依赖:compile("orgspringframework
链路模式是这样的,先看下图:当getOrder这个接口达到阈值时,并且这个阈值条件完全是由/test接口引起的,则对/test1进行限流,这个很大的不一样是对:入口资源进行限流,而不是资源名。举个例子
在关联模式,阈值类型是QPS或线程数,起到的效果是一样的。而关联模式是什么意思呢?假设A资源关联了B资源,当B资源超出阈值了,就限流A自己。这里最重要的是限流自己,即关联方;说简单点,自己的亲戚惹事,
下载地址:sentinel作用:sentinel的组成部分:sentinel只有一个jar包,包含核心库和控制台。使用javajarxxx来运行运行完毕,访问8080端口即可。
前言:Sentinel的如果没有配置持久化的话配置一些流控和服务降级从启项目就会置空所以需要持久化的操作动态规则扩展拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是RDBMS
服务网关1什么是网关2常用主流网关1什么是网关网关:就是服务的统一入口;比如说一个城池,城门相当于网关;那么我们为什么使用网关?:在微服务架构下单体应用被切割成多个微服务,如果讲所有的微服务直接对外暴
实际是很多这样的场景,平时一个系统啥人都没有,但一旦有什么特别的优惠的活动,那并发量就是平时的上百倍。针对这种情况,sentinel在流控效果中提供了一个warnup(预热)的方式,界面如下:假设流控