Sentinel是SpringCloud Alibaba的一个开源服务调控组件,主要以流量作为切入点,从流量控制,熔断降级,系统负载监控等方面来对服务进行调整与控制,作用与Hystrix类似,但Sentinel的功能,使用方式等方面都要比Hystrix更加方便。随着微服务的持续发展,在服务调控方面上,Sentinel已逐渐取代了Hystrix的位置,成为当前市面上最常用的微服务调控组件。
Sentinel主要分为俩个部分,分别是:核心库和控制台。
核心库:经常用在我们的客户端上,与我们的微服务进行嵌套,能够运行在所有的Java环境上,同时它也对Dobbo,SpringCloud等其他微服务框架有很好的支持性。
控制台:主要是一个基于Springboot的一个微服务,可以直接打包运行,类似于我们的nacos服务端。
2. Sentinel的特征以及作用Sentinel是SpringCloud Alibaba生产出来的产品,在测试和应用场景等方面都具有很大的优势,Sentinel的特征主要有:
1.丰富的应用场景: 由于Sentinel是SpringCloud Alibaba生产出来的,在内部测试方面有很大的范围度:比如双十一的时的流量监控,商品秒杀时系统流量的的承受范围等等,正因为他的出身地点不一般,所以在应用场景方面会更加的丰富。
2.完备的实时监控: Sentinel 提供了一个良好的可视化监控页面,在页面上可以对系统的一些接口等方面进行很好的视察,也可以在监控页面上对流量进行调控等。
3.广泛的开源生态: Sentinel 的出现秉承着开源的原则,可以免费使用,同时他也对市面上的一些开源框架有很好的支持。
4.完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。我们可以通过修改源码等方式来创造出更适合我们的Sentinel调控,就比如我们的规则双向持久化等。
Sentinel几乎拥有Hystrix所有的功能特点,比如:服务熔断,服务降级等,同时Sentinel还具有流量控制,系统控制等其他功能,在对服务进行调控时会更加的友好以及细致。
详细可参考官网:https://github.com/alibaba/Sentinel/wiki/Sentinel-%E4%B8%8E-Hystrix-%E7%9A%84%E5%AF%B9%E6%AF%94
1.下载Sentinel的jar包: https://github.com/alibaba/Sentinel/releases
2.启动Sentinel并进入 *** 作界面: 以jar包的方式运行,访问http://localhost:8080/,Sentinel的默认账号和密码都是Sentinel
3.配置相关模块信息: 导入相关依赖以及配置相对应的Sentinel路径
导入pom依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
编写配置信息:
spring:
cloud:
nacos:
discovery:
group: test
service: ${spring.application.name}
server-addr: 127.0.0.1:8848
config:
file-extension: yaml
server-addr: 127.0.0.1:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
编写测试接口:
//NacosConfigTestController类
package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
//支持nacos动态刷新
@RefreshScope
public class NacosConfigTestController {
@Value("${config.info}")
private String info;
@GetMapping("/test")
public String test(){
return info;
}
@GetMapping("/testA")
public String testA(){
return "Sentinel测试接口";
}
}
4.测试: 访问相关的测试接口,如何进入Sentinel控制台查看相关信息
在Sentinel中,有一个注解跟Hystrix里的@HystrixCommand类似,都是为了让我们的熔断降级更加方便 *** 作与展示,那就是@SentinelResource。在@SentinelResource里,我们可以定义资源的名称,因为在Sentinel里中,如果我们不定义资源名称的话,那么sentinel会默认使用路径名来作为资源名称,也可以定义熔断的兜底方法,并且可以定义一个全局的兜底方法类,它的作用比起@HystrixCommand来说的话更加全面。
public @interface SentinelResource {
String value() default "";
EntryType entryType() default EntryType.OUT;
int resourceType() default 0;
String blockHandler() default "";
Class<?>[] blockHandlerClass() default {};
String fallback() default "";
String defaultFallback() default "";
Class<?>[] fallbackClass() default {};
Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class};
Class<? extends Throwable>[] exceptionsToIgnore() default {};
}
value: 资源名称,必需项,因为需要通过resource name找到对应的规则,如果使用了注解,这个参数一定要填。
entryType: entry 类型,有入站和出站,默认是出站。
blockHandle: blockHandler 对应处理 BlockException 的函数名称,可选项。主要是用来设置服务限流或熔断了之后返回的信息,如果不设置,会使用默认的返回信息,就是block by sentinel这个提示信息。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,并且新增一个BlockException的一个参数。
blockHandlerClass: blockHandler 函数默认需要和原方法在同一个类中,如果希望使用其他类的函数,则需要指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。就是说可以使用这个注解来做一个全局的熔断限流返回信息提示类。
fallback: fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。主要是用来处理程序内部出现的错误异常。
fallbackClass: fallbackClass的应用和blockHandlerClass类似,fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultFallback(since 1.6.0): 如果没有配置defaultFallback方法,默认都会走到这里来。
exceptionsToIgnore(since 1.6.0): 用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
5.2 简单使用1.搭建测试项目
CommonSentinel类编写:
package com.example.config;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.RequestParam;
public class CommonSentinel {
//服务限流处理类
public static String Block(@RequestParam(value = "id") String id, BlockException exception) {
return id + "服务被熔断或限流了" + exception.getMessage();
}
//程序异常处理类
public static String Exception() {
return "程序内部出现错误";
}
}
测试类:
package com.example.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.example.config.CommonSentinel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
//支持nacos动态刷新
@RefreshScope
public class NacosConfigTestController {
@Value("${config.info}")
private String info;
@GetMapping("/test")
@SentinelResource(value = "test",blockHandlerClass = CommonSentinel.class,blockHandler = "Block")
public String test(@RequestParam(value = "id") String id){
return id+":"+info;
}
@GetMapping("/testA")
@SentinelResource(value = "testA",fallbackClass = CommonSentinel.class,fallback = "Exception")
public String testA(){
int i = 1 / 0;
return "Sentinel测试接口";
}
}
启动类:
package com.example;
@SpringBootApplication
@EnableDiscoveryClient
public class ServerProvider8081Application {
public static void main(String[] args) {
SpringApplication.run(ServerProvider8081Application.class, args);
}
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
2.测试限流处理类
配置规则
浏览器测试:
3.测试异常处理类
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)