栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Sentinel入门

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Sentinel入门

 目录

1. Sentinel简介

2. Sentinel与Hystrix的区别

3. Sentinel中的管理控制台

3.1. 下载启动控制台

3.2. 客户端能接入控制台

3.3. Rest实现熔断

3.4. Feign实现熔断

 

1. Sentinel简介

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即 突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机 器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快 速地定制逻辑。例如定制规则管理、适配动态数据源等。

2. Sentinel与Hystrix的区别
SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于RxJava)Ring Bit Buffer
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式、匀速器模式、预热排队模式不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
控制台提供开箱即用的控制台,可配置规则、 查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

使用 Sentinel 来进行熔断保护,主要分为几个步骤:

        1. 定义资源

        2. 定义规则

        3. 检验规则是否生效

资源:可以是任何东西,一个服务,服务里的方法,甚至是一段代码。

规则:Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效

3. Sentinel中的管理控制台

3.1. 下载启动控制台

(1)获取 Sentinel 控制台

您可以从官方网站中下载最新版本的控制台 jar 包,下载地址如下:

        https://github.com/alibaba/Sentinel/releases/download/1.6.3/sentinel-dashboard-1.6.3.jar

(2)启动

使用如下命令启动控制台:

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

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080 。

从 Sentinel1.6.0起,Sentinel 控制台引入基本的登录功能,默认用户名/密码:sentinel/sentinel 。可以参考鉴权模块文档配置用户名和密码。

启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

3.2. 客户端能接入控制台

(1)引入依赖

        父工程引入alibaba实现的SpringCloud


    com.alibaba.cloud
    spring-cloud-alibaba-dependencies
    2.1.0.RELEASE
    pom
    import

        子工程中引入sentinel


    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel

(2)配置启动参数

        在工程的application.yml中添加Sentinel 控制台配置信息 (指定控制台的请求路径)

spring:
    cloud:
        sentinel:
            transport:
                dashboard: localhost:8080

(3) 配置熔断降级方法

@GetMapping("/buy/{id}")
@SentinelResource(value="order",blockHandler = "orderblockHandler",fallback= "orderfallback")
public Product order(@PathVariable Long id) {
    return restTemplate.getForObject("http://shop-serviceproduct/product/1", Product.class);
}
//降级方法
public Product orderblockHandler(Long id) {
    Product product = new Product();
    product.setId(-1l);
    product.setProductName("触发熔断降级方法");
    return product;
}
//降级方法
public Product orderfallback(Long id) {
    Product product = new Product();
    product.setId(-1l);
    product.setProductName("触发抛出异常方法");
    return product;
}

        在需要被保护的方法上使用@SentinelResource注解进行熔断配置。与Hystrix不同的是,Sentinel对抛出异常和熔断降级做了更加细致的区分,通过 blockHandler 指定熔断降级方法,通过 fallback 指定触发异常执行的降级方法 

3.3. Rest实现熔断

Spring Cloud Alibabasentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @SentinelRestTemplate 注解。

    
	@SentinelRestTemplate(fallback = "handleFallback",fallbackClass = ExceptionUtils.class,
				blockHandler = "handleBlock",blockHandlerClass = ExceptionUtils.class)
	@LoadBalanced
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

        比如上述 @SentinelRestTemplate 注解中 ExceptionUtil 的 handleException 属性对应的方法 声明如下:

public class ExceptionUtils {

	
	//限流熔断业务逻辑
	public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
		Product product=new Product();
		product.setProductName("block");
		return new SentinelClientHttpResponse(JSON.toJSonString(product));
	}

	//异常降级业务逻辑
	public static SentinelClientHttpResponse handleFallback(HttpRequest request, byte[] body,
		ClientHttpRequestExecution execution, BlockException ex) {
		Product product=new Product();
		product.setProductName("block");
		return new SentinelClientHttpResponse(JSON.toJSonString(product));
	}

}

3.4. Feign实现熔断

Sentinel 适配了 Feign 组件。如果想使用,除了引入 sentinel-starter 的依赖外还需要 2 个步骤:

  • 配置文件打开 sentinel 对 feign 的支持: feign.sentinel.enabled=true
  • 加入 openfeign starter 依赖使 sentinel starter 中的自动化配置类生效

(1) 引入依赖 


    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel


    org.springframework.cloud
    spring-cloud-starter-openfeign

 (2) 开启sentinel 支持

feign:
    sentinel:
        enabled: true

(3)配置FeignClient(跟Hystrix配置一样)

//指定需要调用的微服务名称
@FeignClient(name="shop-service-product",fallback = ProductFeginClientCallBack.class)
public interface ProductFeginClient {
    //调用的请求路径
    @RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
    public Product findById(@PathVariable("id") Long id);
}
@Component
public class ProductFeginClientCallBack implements ProductFeginClient {
    
    public Product findById(Long id) {
        Product product = new Product();
        product.setId(-1l);
        product.setProductName("熔断:触发降级方法");
        return product;
    }
}

 上一页              下一页

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270167.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号