springcloud-Sentinel初步配置

SpringCloud-Sentine(熔断和监控)

Sentinel 是阿里巴巴开源的一款断路器实现

Sentinel与Hystrix的区别

springcloud-Sentinel初步配置_第1张图片

一、配置管理控制台

  1. 下载sentinel-dashboard.jar

点这个连接直接下载1.3.0版:https://github.com/alibaba/Sentinel/releases/download/1.3.0/sentinel-dashboard-1.3.0-en.jar

或者进入https://github.com/alibaba/Sentinel/wiki/Dashboard 页面的标题2.1Download the dashboard

(sentinel中文文档地址:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D )

(sentinel-dashboard.jar官方使用:https://github.com/alibaba/Sentinel/wiki/Dashboard)

  1. cmd中运行命令(sentinel的jar所在目录)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -
Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  1. 打开浏览器输入 http://localhost:8080

默认用户,密码都是sentinel,(参考https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0#%E9%89%B4%E6%9D%83 对用户密码配置)

默认情况下Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。也可以配置sentinel.eager=true ,取消Sentinel控制台懒加载(懒加载:只有访问该微服务才会在sentinel控制台监控到)。

二、项目配置

  1. 引入jar包依赖

非springcloud程序需要引入:

<dependency>
    <groupId>com.alibaba.cspgroupId>
    <artifactId>sentinel-transport-simple-httpartifactId>
dependency>

springclou程序引入:

  • 父工程
<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-alibaba-dependencies               artifactId>
    #注意这个版本,要和springcloud相关
    <version>2.1.0.RELEASEversion>
    <type>pomtype>
    <scope>importscope>
dependency>

ps: spring-cloud-alibaba和spring-cloud有版本问题,需要配置对应的版本(https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E)
springcloud-Sentinel初步配置_第2张图片

  • 子工程
<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel 	         artifactId>
dependency>
  1. 配置启动参数
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
        

非必需:

【这部分配置可在控制台进行配置 http://localhost:8080】

springcloud-Sentinel初步配置_第3张图片

也可在resources/application.yml进行配置+ resources/json文件

application.yml配置文件添加如下配置
#通过文件读取限流规则
spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow

然后在resources目录下创建flowrule.json文件

[
  {
    "resource": "orderFindById",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]
json文件配置的各参数对应的意思:
    resource:资源名,即限流规则的作用对象
    count: 限流阈值
    grade: 限流阈值类型(QPS 或并发线程数)
    limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
    strategy: 调用关系限流策略
    controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

更多可查看 RuleConstant.java类
  1. 配置熔断降级方法

a.通用资源配置熔断

/* Controller方法添加SentinelResource注解
*		blockHandler 	指定熔断降级方法,
*		fallback 		指定触发异常执行的降级方法
*/
@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;
}

与Hystrix不同的是,Sentinel对抛出异常和熔断降级做了更加细致的区分,通过blockHandler 指定熔断降级方法,通过fallback 指定触发异常执行的降级方法。


b.对RestTemplate的支持

  1. 在构造RestTemplate bean的时候需要加上 @SentinelRestTemplate 注解。
public class RestOrderApplication {

	/**
	 *
	 *  资源名:
	 *       httpmethod:schema://host:port/path :协议、主机、端口和路径
	 *       httpmethod:schema://host:port :协议、主机和端口
	 *
	 *  @SentinelRestTemplate:
	 *    异常降级
	 *      fallback      : 降级方法
	 *      fallbackClass : 降级配置类
	 *    限流熔断
	 *      blockHandler
	 *      blockHandlerClass
	 */

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

	public static void main(String[] args) {
		SpringApplication.run(RestOrderApplication.class,args);
	}
}

  1. 定义SentinelRestTemplate注解中配置的class和方法

定义的方法有要求:

  • 静态方法
  • 返回值: SentinelClientHttpResponse
  • 参数 : request , byte[] , clientRquestExcetion , blockException
public class ExceptionUtils {

	/**
	 * 静态方法
	 *      返回值: SentinelClientHttpResponse
	 *  	参数 : request , byte[] , clientRquestExcetion , blockException
	 */
	//限流熔断业务逻辑
	public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
      Product product = new Product();
		product.setProductName("限流熔断");
		return new SentinelClientHttpResponse (JSON.toJSONString(product) );
	}

	//异常降级业务逻辑
	public static SentinelClientHttpResponse handleFallback(HttpRequest request, byte[] body,
		ClientHttpRequestExecution execution, BlockException ex) {
		return new SentinelClientHttpResponse("def");
	}

}

c.对Feign的支持

  1. 依赖
<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
  1. 开启sentinel 支持
    在工程的application.yml中添添加sentinel 对 feign 的支持
feign:
  sentinel:
    enabled: true
  1. 配置FeignClient

和使用Hystrix的方式基本一致,需要配置FeignClient接口以及通过fallback 指定熔断降级方法

//指定需要调用的微服务名称
@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);
}
  1. 配置熔断方法
/**
* 实现自定义的ProductFeginClient接口
* 在接口实现类中编写熔断降级方法
*/
@Component
public class ProductFeginClientCallBack implements ProductFeginClient {
    /**
    * 降级方法
    */
    public Product findById(Long id) {
    Product product = new Product();
    product.setId(-1l);
    product.setProductName("熔断:触发降级方法");
    return product;
    }
}

Feign 对应的接口中的资源名策略定义:

httpmethod:protocol://requesturl
// httpmethod就是GET或者POST这些

@FeignClient 注解中的所有属性,Sentinel 都做了兼容。
ProductFeginClient 接口中方法findById 对应的资源名为GET:http://shop-serviceproduct/product/{str}。



@SentinelResource注解的参数

springcloud-Sentinel初步配置_第4张图片springcloud-Sentinel初步配置_第5张图片





项目源码:https://gitee.com/hxmkd/spring-cloud/tree/master/study_springcloud6_sentinel

你可能感兴趣的:(springcloud,sentinel,springcloud)