微服务保护框架Sentinel的安装和保护的使用

 1.Sentinel

1.1介绍

Sentinel是阿里巴巴开源的一款服务保护框架:home | Sentinel (sentinelguard.io)

Sentinel 的使用可以分为两个部分:

  • 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。

  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

1.2安装 

有两种安装方式,任选一种

1.2.1本地安装

下载地址:

Releases · alibaba/Sentinel (github.com)icon-default.png?t=O83Ahttps://github.com/alibaba/Sentinel/releases将jar包放在任意非中文、不包含特殊字符的目录下,重命名为sentinel-dashboard.jar

然后运行如下命令启动控制台:

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

1.2.2docker安装部署

拉取镜像:

docker pull bladex/sentinel-dashboard:1.8.0

run:

docker run --name sentinelDashboard -d -p 8090:8090 镜像id

安装完成后,

访问http://localhost:8090页面,就可以看到sentinel的控制台了:

需要输入账号和密码,默认都是:sentinel

登录后,即可看到控制台,默认会监控sentinel-dashboard服务本身:

1.3微服务整合

引入sentinel依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

 修改application.yaml文件,添加下面内容:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true # 开启请求

重启项目,多发送几次请求之后能在sentinel中看到:

2.请求限流

在簇点链路后面点击流控按钮,即可对其做限流配置:

这样就把查询购物车列表这个簇点资源的流量限制在了每秒6个,也就是最大QPS为6.

3.线程隔离

3.1配置线程隔离

限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。

注意,这里勾选的是并发线程数限制,也就是说这个查询功能最多使用6个线程,而不是6QPS。如果查询商品的接口每秒处理2个请求,则6个线程的实际QPS在12左右,而超出的请求自然会被拒绝。

3.2OpenFeign整合Sentinel:

修改模块的application.yml文件,开启Feign的sentinel功能

feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

3.3fallback实现步骤:

1.自定义类,实现fallbackfactory ,编写某个FeignClient的fallback逻辑

2.将刚刚定义的fallbackfactory注册成一个Bean

3.在接口中使用fallbackfactory如:

@FeignClient(value = "item-service",fallbackFactory = ItemClientFallbackFactory.class)

4.服务熔断

Sentinel中的断路器不仅可以统计某个接口的慢请求比例,还可以统计异常请求比例。当这些比例超出阈值时,就会熔断该接口,即拦截访问该接口的一切请求,降级处理;当该接口恢复正常时,再放行对于该接口的请求。

断路器的工作状态切换有一个状态机来控制:

状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态

  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态持续一段时间后会进入half-open状态

  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。

    • 请求成功:则切换到closed状态

    • 请求失败:则切换到open状态

4.1配置熔断

在控制台通过点击簇点后的熔断按钮来配置熔断策略:

这种是按照慢调用比例来做熔断,上述配置的含义是:

  • RT超过200毫秒的请求调用就是慢调用

  • 统计最近1000ms内的最少5次请求,如果慢调用比例不低于0.5,则触发熔断

  • 熔断持续时长20s

4.2编写降级逻辑

触发限流或熔断后的请求不一定要直接报错,也可以返回一些默认数据或者友好提示,用户体验会更好。

给FeignClient编写失败后的降级逻辑有两种方式:

  • 方式一:FallbackClass,无法对远程调用的异常做处理

  • 方式二:FallbackFactory,可以对远程调用的异常做处理,我们一般选择这种方式。

//fallbackFactory 失败降级逻辑示例
@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);
                // 查询购物车允许失败,查询失败,返回空集合
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                // 库存扣减业务需要触发事务回滚,查询失败,抛出异常
                throw new BizIllegalException(cause);
            }
        };
    }
}

JDK17运行报错可以见:JDK17运行seata发生报错Error creating bean with name ‘globalTransactionScanner‘的解决方案-CSDN博客

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值