前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍sentinel的概念,优点,与Hystrix的对比以及微服务中整合Sentinel,后续文章将详细介绍Sentinel的细节部分。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
以下正文开始
初始Sentinel
Sentinel是一款开源的分布式系统的实时监控和自动化故障恢复工具。它是阿里巴巴开源的一款分布式系统的流量控制和熔断降级组件,主要用于保护服务的稳定性。Sentinel提供了实时的流量控制、熔断降级、系统负载保护等功能,能够帮助开发者有效地保护应用程序,防止故障和异常情况的发生。
Sentinel的主要功能包括:
-
实时监控:Sentinel可以监控分布式系统中的各种指标,如QPS、CPU、内存等,并提供实时的监控数据和报警功能。
-
流量控制:Sentinel可以根据系统的负载情况来进行流量控制,以保证系统的稳定性和可靠性。
-
自动化故障恢复:Sentinel可以自动化地对系统中出现的故障进行恢复,以减少人工干预的成本和时间。
-
熔断降级:Sentinel可以根据系统的负载情况来进行熔断降级,以保证系统的稳定性和可靠性。
-
规则配置:Sentinel提供了丰富的规则配置功能,可以根据不同的应用场景来进行灵活的配置。
Sentinel的优点包括:
-
简单易用:Sentinel提供了一种简单易用的方式来保护分布式系统的稳定性和可靠性。
-
高效稳定:Sentinel采用了高效稳定的设计和实现,可以在大规模分布式系统中运行良好。
-
开源免费:Sentinel是一款开源的软件,可以免费使用和修改。
-
社区支持:Sentinel拥有一个活跃的开源社区,可以获得开发者们的支持和帮助。
总之,Sentinel是一款非常实用的分布式系统监控和自动化故障恢复工具,可以帮助开发者们更好地保护分布式系统的稳定性和可靠性。
Sentinel与Hystrix的对比
在之前的文章中介绍过Hystrix,也介绍过Hystrix组件提供给微服务断路器、资源隔离与自我修复功能,那么Sentinel与Hystrix有什么区别呢?
Sentinel和Hystrix都是流行的服务熔断/降级解决方案,它们的主要区别如下:
-
适用范围:Hystrix适用于Spring Cloud微服务框架,而Sentinel不仅适用于Spring Cloud,还适用于Dubbo、gRPC、Servlet等各种应用场景。
-
功能特性:Hystrix主要提供熔断、降级、限流和缓存等功能,Sentinel则提供了更丰富的功能,包括熔断、降级、限流、系统保护、热点参数限流、授权等。
-
适用场景:Hystrix适用于单体应用和微服务架构中的服务熔断和降级,Sentinel则更适用于复杂的分布式系统中的服务治理和流量控制。
-
技术实现:Hystrix使用线程池和信号量来实现熔断和降级,Sentinel则使用基于AOP的切面和字节码增强技术来实现流量控制和降级。
对此做个小结:Hystrix更适合单体应用和简单的微服务架构,而Sentinel则更适合复杂的分布式系统和服务治理场景。
微服务整合Sentinel
在实际项目中,整合 Sentinel 可以分为以下几个步骤:
- 添加依赖
在项目的 pom.xml 文件中添加 Sentinel 的依赖:
<dependency>
<groupId>***.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
- 配置 Sentinel
在项目的 application.yml 或 application.properties 文件中配置 Sentinel 的相关参数:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel
groupId: DEFAULT_GROUP
rule-type: flow
其中,dashboard 属性指定了 Sentinel 控制台的地址,datasource 属性指定了 Sentinel 的数据源,这里使用了 Nacos 作为数据源。
- 配置 AOP
使用 Sentinel 需要在代码中添加 AOP 切面,对方法进行拦截和统计。在 Spring Boot 项目中,通常使用 @Aspect 注解和 @Pointcut 注解来定义切面和切点:
@Aspect
@***ponent
public class SentinelAspect {
@Pointcut("@annotation(***.alibaba.csp.sentinel.annotation.SentinelResource)")
public void sentinelPointcut() {
}
@Around("sentinelPointcut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
// 获取 Sentinel 资源名称
String resourceName = point.getSignature().getName();
SentinelResource annotation = AnnotationUtils.findAnnotation(point.getTarget().getClass(), SentinelResource.class);
if (annotation != null && StringUtils.hasText(annotation.value())) {
resourceName = annotation.value();
}
// Sentinel 限流和熔断
Entry entry = null;
try {
entry = SphU.entry(resourceName);
return point.proceed();
} catch (BlockException e) {
throw new RuntimeException("Blocked by Sentinel: " + e.getClass().getSimpleName());
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
在上面的代码中,定义了一个名为 sentinelPointcut 的切点,使用 @Around 注解对该切点进行拦截和统计。在拦截方法时,先获取 Sentinel 资源名称,然后使用 SphU.entry 方法进入 Sentinel 保护的资源,如果被限流或熔断,则抛出异常。最后使用 entry.exit 方法退出资源。
- 使用 Sentinel
在需要保护的方法上添加 @SentinelResource 注解,指定资源名称和限流规则:
@Service
public class UserServiceImpl implements UserService {
@Override
@SentinelResource("getUserById")
public User getUserById(Long id) {
// 查询数据库
return userDao.selectById(id);
}
}
在上面的代码中,使用 @SentinelResource 注解指定了资源名称为 getUserById,表示该方法需要被 Sentinel 保护。如果该方法被限流或熔断,则会抛出异常。同时,可以在 Sentinel 控制台中配置限流规则,以控制该方法的访问频率和并发数。
- 启动 Sentinel 控制台
在本地启动 Sentinel 控制台,使用以下命令:
java -jar sentinel-dashboard-1.8.2.jar
然后在浏览器中访问 http://localhost:8080,即可进入 Sentinel 控制台,查看应用的监控数据和限流规则。
图书推荐
本期图书推荐为《Java并发编程实战》
《Java并发编程实战》适读人群 :有Java开发经验的开发者。
*十年畅销100000册,Java并发编程经典图书。本书不仅讲解了并发的理论基础,还介绍了各种实际的开发技术。书中并不是简单罗列出各种并发API及机制,而是详细介绍了许多设计原则、设计模式及思维模式,可帮助开发人员构建出正确的、高性能的并发程序。
粉丝福利:评论区任意留言可参与活动抽奖(可评论最多五条,抽取三名欧皇)
京东自营购买链接:点击查看详情
好了,本篇文章就先分享到这里了,后续将会继续介绍sentinel详细的限流规则等方面的知识,感谢大佬认真读完支持咯~
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞