Sentinel入门

简介:

Sentinel是阿里巴巴开源的一款用于流量控制、熔断降级和系统负载保护的库。它可以帮助开发者实现对分布式系统中的服务进行流量控制,避免因为流量激增而导致系统崩溃或服务质量下降。

Sentinel主要功能包括:

  1. 流量控制:Sentinel可以对应用程序的入口流量进行实时的监控和控制,通过设定阈值来限制并发请求的数量,防止系统因为过多请求而崩溃或过载。

  2. 熔断降级:当系统中的某个服务出现故障或不稳定时,Sentinel可以实现熔断,停止向该服务发送请求,避免整个系统的连锁故障,同时提供降级策略来保证系统的可用性。

  3. 系统负载保护:Sentinel可以监控系统的负载情况,根据系统负载自动调整流量控制策略,避免系统负载过高导致性能下降。

  4. 实时统计和监控:Sentinel提供了实时的统计信息和监控面板,方便开发人员实时查看系统的运行状态和流量情况,及时进行调整和优化。

总的来说,Sentinel是一款强大的流量控制和系统保护库,可以帮助开发者构建健壮的分布式系统,提高系统的稳定性和可靠性。

可解决问题:

服务雪崩
是指因为一个服务出现问题,导致依赖它的服务也受到影响,进而让整个系统 延迟或失效的现象
称为雪崩。
雪崩的解决方案
隔离 业务隔离、线程池隔离、信号量隔离?
超时设置 远程调用时设置最大响应时间
限流 限制系统的输入和输出流量,以达到保护系统的目的。
熔断 当下游服务因访问压力过大而变慢时,上游暂时切断对下游服务的调用。 这种牺牲局部
保全部的措施称为熔断。
降级 托底方案。

对比:

具体应用:

下载与启动:

java -jar sentinel-dashboard-1.6.3.jar

引入依赖

XML 复制代码
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

添加配置

XML 复制代码
spring:
application:
name: sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080 # dashboard服务地址
port: 8719 #??

限流

先访问,后设置规则。

java 复制代码
@GetMapping("/byResource")
@SentinelResource(value = "根据资源", blockHandler = "handleRateLimit")
public String getResource() {
return "byResource";
}
@GetMapping("/byUrl")
public String getByUrl() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "byUrl";
}
public String handleRateLimit(BlockException exception) {
return "被流控了!";
}

规则持久化

  1. 添加依赖
XML 复制代码
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  1. 在流控应用中添加配置 所谓流控应用,就是要施加持久流控规则的应用。在其
    application.yml 中添加:
TypeScript 复制代码
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848
data-id: ${spring.application.name}
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
  1. 在 nacos 中添加对应的配置 服务名使用上述 ${spring.application.name} 指定的 user( 我的应
    用服务名为 user).
java 复制代码
[
{
"resource": "/user/{id}",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]

熔断

  1. RestTemplate 熔断
    使用 @SentinelRestTemplate 修饰 RestTemplate 实现
java 复制代码
@Bean
@SentinelRestTemplate
public RestTemplate restTemplate() {
return new RestTemplate();
}
  1. Feign 熔断 记得在配置中打开
java 复制代码
feign:
sentinel:
enabled: true

定义接口

java 复制代码
@FeignClient(value="", fallback=UserServiceFallback.class)
public interface UserService {
}

降级

Feign也支持服务降级,本质上它就是使用Hystrix来实现的。
修改Feign接口

java 复制代码
@FeignClient(name="house", fallback = HouseFeignServiceFallback.class)

新建降级fallback类
降级类要实现上面定义的接口,并实现降级方法,另外注意在降级类上添加@Service注解,以纳入spring管理

java 复制代码
@Service
public class OrderServiceCallback implements OrderServiceFeign{
    @Override
    public Integer getOrderNumberOfUser(Long id) {
        return 22;
    }

    @Override
    public Map postOrderNumberOfUser(Long id) {
        Map result = new HashMap();
        result.put("number",23);

        return result;
    }
}

改配置

因为feign也是使用hystrix实现的降级,且默认没有打开降级支持,所以这里需要打开hystrix功能

java 复制代码
feign:
  hystrix:
    enabled: true
打开日志

打开Feign调用日志,方便查找问题。

java 复制代码
//注意,需要放在被@Configuration修饰的类中
@Bean
Logger.Level feignLogLevel() {
    return Logger.Level.FULL;
}

同时,需要配置yml文件中的日志等级。

java 复制代码
logging:
  level:
    org.example.service: debug
相关推荐
读书点滴几秒前
笨方法学python -练习14
java·前端·python
lingRJ7771 分钟前
微服务架构下的抉择:Consul vs. Eureka,服务发现该如何选型?
java·eureka·springcloud·consul·backend·microservices·servicediscovery
RainbowSea2 分钟前
问题:后端由于字符内容过长,前端展示精度丢失修复
java·spring boot·后端
C182981825754 分钟前
OOM电商系统订单缓存泄漏,这是泄漏还是溢出
java·spring·缓存
Ein hübscher Kerl.8 分钟前
虚拟机上安装 MariaDB 及依赖包
数据库·mariadb
风象南18 分钟前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
醇醛酸醚酮酯37 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
我是一只代码狗1 小时前
springboot中使用线程池
java·spring boot·后端
hello早上好1 小时前
JDK 代理原理
java·spring boot·spring
PanZonghui1 小时前
Centos项目部署之Java安装与配置
java·linux