Springboot项目整合Sentinel

版本

  • springboot : 2.2.7.RELEASE
  • spring-cloud-starter-alibaba-sentinel : 2.2.2.RELEASE
  • sentinel-transport-simple-http : 1.7.2
  • sentinel-datasource-nacos : 1.8.0
  • nacos : 1.3.2

dependency

        <!-- Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.7.2</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.0</version>
        </dependency>

sentinel控制台相关的规则,直接在内存中操作,无法直接持久化保存,项目重新启动后,配置的规则会丢失,所以选择了nacos进行规则的持久化保存。在nacos配置后,项目重启后仍能从nacos获取到配置的规则数据。

application.yml

  application:
    name: xxxxx
  cloud:
    sentinel:
      eager: true
      transport:
        dashboard: 172.16.2.2:8083 # 启动的sentinel-dashboard控制台
        port: 8721
        heartbeat-interval-ms: 1000
      datasource:
        ds1: # 流控规则
          nacos:
            server-addr: 172.16.2.2:8848 # nacos配置中心
            namespace: xxxxx
            username: nacos
            password: nacos
            dataId: xxxxx
            group: DEFAULT_GROUP
            data-type: json
            rule-type: flow
        ds2: # 降级规则
          nacos:
            server-addr: 172.16.2.2:8848
            namespace: xxxxx
            username: nacos
            password: nacos
            dataId: xxxxx
            group: DEFAULT_GROUP
            data-type: json
            rule-type: degrade
      log: # sentinel 控制台 日志路径
        dir: /home/xxx/csp

一些教程中配置nacos时,没有设置spring.cloud.sentinel.datasource.ds1.nacos.username和spring.cloud.sentinel.datasource.ds1.nacos.password 会在启动时由于npe问题而创建bean出错。高版本需要设置这个两个值才可以。

监听熔断器状态变化事件

@Component
public class SentinelUtil {

    public static final Logger logger = LoggerFactory.getLogger(SentinelUtil.class);

    private static CircuitBreakerStateChangeObserver getCircuitBreakerStateChangeObserver() {
        // OPEN 、HALF-OPEN、CLOSED 状态的切换
        return (prevState, newState, rule, snapshotValue) -> {
            if (newState == CircuitBreaker.State.OPEN) {
                // 变换至 OPEN state 时会携带触发时的值
                final String content = String.format("%s -> OPEN at %s, snapshotValue=%.2f, resource=%s",
                                                     prevState.name(),
                                                     DateTimes.formatTemporal("yyyy-MM-dd HH:mm:ss",
                                                                              LocalDateTime.now()),
                                                     snapshotValue, rule.getResource());
                final boolean send = MailUtil.sendNotifyFailedMail("接口状态变化通知", content);
                if (!send) {
                    logger.error("接口状态变化通知 发送失败");
                }
            } else {
                final String content = String.format("%s -> %s at %s, snapshotValue=%.2f,resource=%s",
                                                     prevState.name(), newState.name(),
                                                     DateTimes.formatTemporal("yyyy-MM-dd HH:mm:ss",
                                                                              LocalDateTime.now()),
                                                     snapshotValue, rule.getResource());
                final boolean send = MailUtil.sendNotifyFailedMail("接口状态变化通知", content);
                if (!send) {
                    logger.error("接口状态变化通知 发送失败");
                }
            }
        };
    }

    @PostConstruct
    public void registerStateChangeObserver() {
        EventObserverRegistry.getInstance()
                .addStateChangeObserver("logging", getCircuitBreakerStateChangeObserver());
    }
}

这里做了简单的特定的处理,在状态变化时进行邮件通知。也可以记录到数据库中。

注意点

  1. @SentinelResource注解 不支持private方法,也需要spring托管的类中的方法才可以。
  2. 使用fallbackClass时,fallback方法必须是public static方法。
  3. 多个项目实例连接至sentinel控制台,不需要更改spring.cloud.sentinel.sentinel.port=xxxx(默认8719)端口,sentinel会自动尝试探测使用后面的端口。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sentinel是阿里巴巴开源的一款轻量级的流量控制和熔断框架,可以保护服务在高并发、复杂的网络环境下稳定运行。下面介绍如何将Sentinel整合Spring Boot项目中。 1. 添加Sentinel依赖 在pom.xml中添加Sentinel的依赖: ``` <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.1.RELEASE</version> </dependency> ``` 2. 配置Sentinel 在application.yml中添加Sentinel的配置: ``` spring: cloud: sentinel: transport: dashboard: localhost:8080 port: 8719 log-dir: ${user.home}/logs/csp/sentinel heartbeat-interval-ms: 20000 enable: true ``` 其中,dashboard是Sentinel控制台的地址,port是Sentinel客户端的端口号,log-dir是Sentinel日志存储路径,heartbeat-interval-ms是心跳间隔时间,enable表示是否启用Sentinel。 3. 配置Sentinel注解支持 在Spring Boot的启动类上添加@EnableSentinel注解,开启Sentinel的注解支持。 ``` @SpringBootApplication @EnableSentinel public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 4. 使用Sentinel 在需要进行流量控制和熔断的方法上添加@SentinelResource注解,指定资源名称和对应的限流规则和熔断规则。 ``` @Service public class UserService { // 指定资源名称,限流阈值为每秒最多处理5个请求 @SentinelResource(value = "getUser", blockHandler = "handleBlock", fallback = "handleFallback", blockHandlerClass = UserServiceBlockHandler.class, fallbackClass = UserServiceFallback.class) public User getUser(Long id) { // 查询用户信息 } } ``` 其中,blockHandler指定限流处理方法,fallback指定熔断处理方法,blockHandlerClass和fallbackClass分别指定限流处理和熔断处理类。需要注意的是,限流和熔断处理方法的参数和返回值类型需要与原方法保持一致。 以上就是将Sentinel整合Spring Boot项目中的步骤,希望能帮助到你。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值