前言
本文会继续上篇文章,对SpringCloud Alibaba的组件做详细介绍,并对其使用方法做实例演示说明,本章主要是对SpringCloud Alibaba的组件Nacos(配置管理) 、Sentienl(限流) 和Sentinel(流控) 做详细介绍学习,欢迎评论区讨论交流。
目录
第一章 配置管理--Nacos中的配置
Nacos作为Spring Cloud Alibaba的一个重要组件,它不仅可以用作服务注册与发现,也可以用来替代Spring Cloud Config作为统一配置文件管理,而且他的使用更为简单和人性化。
1、Nacos添加配置
第一步:打开Nacos监控面板 - 进入配置列表 -点击 “+” 图标添加配置 如下:
第二步:填写Data ID,选择YAML,编辑配置文件内容
这里定义了一个名字为application-user-dev.yaml的配置,使用的是YAML格式。
-
Data ID
: 非常重要,可以看做是配置的文件的名字,在程序中拉取配置文件的时候需要指定Data ID。 -
Group
: 分组,默认是 DEFAULT_GROUP , 可以针对不同的项目指定不同的配置组。
2、客户端接入配置中心
2.1、导入依赖
添加配置中心依赖nacos-config,完整pom.xml如下。
<dependencies>
<!-- 配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloudalibaba-user-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.2、编写Controller
@RefreshScope
注解是用来做配置自动刷新。那么当我们修改了Nacos中的配置文件,Controller中读取到的配置temp.notify
将会自动变化。
@RestController
@RefreshScope //刷新配置
public class OrderController {
@Autowired
public UserFeigoncCients userFeigoncCients;
@GetMapping("/order/{id}")
public User order(@PathVariable("id") Long id){
return userFeigoncCients.user(id);
}
}
2.3、修改yml配置
spring:
profiles:
active: dev #环境
cloud:
nacos:
config:
prefix: application-order #前缀
file-extension: yaml #后缀
server-addr: localhost:8848 #地址
extension-configs: #公共配置
- application.yaml
-
spring.cloud.nacos.config.server-addr
:配置了Nacos的地址 -
spring.cloud.nacos.config.file-extension
:指定了配置文件的格式为YAML,默认是properties, -
spring.cloud.nacos.config.prefix
:配置前缀,如果不配置前缀默认会把 服务名即spring.application.name
的值作为前缀 -
spring.cloud.nacos.config.group
:分组名,默认是DEFAULT_GROUP对应了Nacos配置中的Group -
spring.profiles.active
:配置了环境为dev .该配置可以实现多配置多环境管理
根据如上配置,那么config客户端会将:前缀+环境+后缀 拼接成的文件名“application-user-dev.yaml
” 去Nacos上查找是否有对应Data ID的配置文件。
第二章 Sentienl--限流
限流 , 限制流量,这里的流量我们可以理解成请求数量,其实就是限制服务器的请求并发数量,如果不做限流,那么在大量并发请求下我们的服务器会慢慢的变慢然后顶不住压力而挂掉(类似堵车)。并不是说并发越大越好,有的时候我们的项目规模和业务决定了我们不需要那么大的并发性,当大量的并发请求访问到服务器时我们需要把部分请求拒绝在外,这个是流量限制 - 限流。
1、Sentinel介绍
Sentinel诞生于阿里巴巴,其主要目标是流量控制和服务熔断
,2018年,Sentinel演变为一个开源项目现如今成为了Spring Cloud Alibaba的一个子项目。Sentinel是通过限制并发线程的数量来减少不稳定资源的影响
,而不是使用线程池,省去了线程切换的性能开销。
当资源的响应时间变长时,线程将开始被占用。当线程数累积到一定数量时,新的传入请求将被拒绝
。反之亦然,当资源恢复并变得稳定时,占用的线程也将被释放,新请求将被接受。
除了限制并发性外,Sentinel可以根据响应时间降级
不稳定资源也是保证可靠性的有效方法。当资源的响应时间太大时,将在指定的时间窗口中拒绝所有对该资源的访问
。-- 熔断机制
此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。
2、Sentinel使用
2.1、Sentinel Server服务端
Sentinel 提供了现成的服务端供我们使用,点我下载地址,下载之后通过命令行启动
运行命令:java -jar -Dserver.port=1111 sentinel-dashboard-1.6.0.jar
访问:http://127.0.0.1:1111
进入控制台,使用 sentinel/sentinel登录:
主页面效果:
2.2、Sentinel 客户端接入
1、导入依赖
<!--sentinel的基础依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、配置Sentinel
修改yml配置,添加senticel服务控制台地址
spring:
cloud:
sentinel:
transport:
dashboard: localhost:1111
3、资源限流
Sentinel为我们提供了 @SentinelResource
注解标记需要限流的资源。
@GetMapping("/user/{id}")
@SentinelResource(value="userById",blockHandler = "userBlockHandler") //限流降级
public User user(@PathVariable("id") Long id){
return new User(id,"测试" + hos+":"+ notify);
}
// 限流与阻塞处理 : 参数要和 被降级的方法参数一样
public User userBlockHandler(@PathVariable("id") Long id, BlockException e){
e.printStackTrace();
return new User(-1l,"限流了");
}
同时这里通过 blockHandler
属性我配置了一个限流降级方法,即当“user”资源触发限流了会调用blockHandler
指向的降级方法返回拖地数据,不至于抛出默认的限流异常信息给客户端(一串英文用户也看不懂) ,需要注意的是:降级方法要和被限流的方法参数一致,然后加上 BlockException异常对象。
也可以通过 blockHandlerClass 属性把降级方法写在一个专门的类中
3、Sentinel设置限流策略
启动应用 springcloudalibaba-user-server-1010 ,登录Sentinel控制台,在“实时监控”列表中可以看到资源的相关监控信息的
在 “族点链路” 列表中可以看到资源的调用链 ,并且可以通过“流控”按钮设置流控规则
通过QPS限流(每秒请求数量),阈值是 1 ,意思是这个资源每秒只能有1个请求进来,多余的请求会触发限流,返回降级数据。
4、Gateway使用Sentinel限流
4.1、导入依赖
这里我们需要导入sentinel基础依赖和 sentinel-gateway 整合依赖
<!-- 限流和gataway使用-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
4.2、配置Sentinel地址
修改yml配置,增加Sentinel服务地址
spring:
cloud:
sentinel:
transport:
dashboard: localhost:1111
4.3、配置限流规则
启动Gateway,登录sentinel控制台,对url资源进行流控限制,配置方式和前面的配置方式一样
4.4、限流降级
在达到设置的阈值时就会触发该方法
@Configuration
public class SentinelConfig {
public SentinelConfig(){
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
return ServerResponse.ok().body(Mono.just("限流啦,请求太频繁"),String.class);
}
});
}
}
5、整合Nacos持久化限流规则
5.1、导入基础依赖
<!--Sentinel和Nacos做持久的-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.5.2</version>
</dependency>
5.2、配置持久化nacos地址
yaml配置
datasource:
flow:
nacos: #限流持久配置
server-addr: localhost:8848 #使用nacos的持久
dataId: application-user-flow-dev #获取限流的数据源的dataId
groupId: DEFAULT_GROUP
rule-type: flow #类型:限流
-
spring.cloud.sentinel.datasource.ds.nacos.server-addr:nacos的访问地址
-
spring.cloud.sentinel.datasource.ds.nacos.groupId:nacos中存储规则的groupId
-
spring.cloud.sentinel.datasource.ds.nacos.dataId:nacos中存储规则的dataId
-
spring.cloud.sentinel.datasource.ds.nacos.rule-type:该参数是用来定义存储的规则类型。所有的规则类型可查看枚举类:...datasource.RuleType,每种规则的定义格式可以通过各枚举值中定义的规则对象来查看,比如限流规则可查看:...flow.FlowRule
简而言之,这里是配置了Sentinel持久化针对于Nacos的相关信息,程序会去地址为localhost:8848的Nacos中查找DataId为 application-user-sentinel-dev,GourpId为 DEFAULT_GROUP的文件作为限流策略(rule-type: flow代表限流)。
5.3、Nacos持久化Sentinel限流规则
在Nacos中的配置管理中添加一个Json格式的文件application-user-flow-dev
[
{
"resource": "userById",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
-
resource:对那个资源进行限流
-
limitApp:这个是流控的调用者,default 代表不区分调用者
-
grade:限流方式0是根据并发数量限流,1是表根据QPS来限流
-
count:限流阈值,达到这个阈值就被限流,触发降级。
-
strategy:基于调用链的流控制策略。0 直接,1 关联 2 链路
-
controlBehavior:流控效果,0 直接拒绝,1是Warm Up,2是匀速排队
-
clusterMode:是否为集群
第三章 Sentinel--熔断
Sentinel的服务熔断机制会对调用链上的某个不稳定(宕机,异常,超时)的资源,做出请求限制,快速失败,避免影响到其它的服务而导致级联错误
。资源熔断后,在后续的一定时间(时间窗口)之内,对该服务的请求都自动熔断,抛出 DegradeException异常。
Sentinel拥有比Hystrix更强大和丰富的功能,能满足我们的各种应用场景,并且经历过淘宝双十一的考验,是微服务架构中熔断机制的不二选择。
1、开启Sentinel
OpenFeign与Sentinel组件集成除了引入sentinel-starter
依赖关系之外,还需要在属性文件中启用Sentinel支持
feign:
sentinel:
enabled: true #熔断
2、给Feign接口降级
@FeignClient(value = "user-service",fallbackFactory = userFallback.class) // fallbackFactory熔断 调用降级类
public interface UserFeigoncCients {
@GetMapping("/user/{id}")
User user(@PathVariable("id") Long id);
}
这里跟Feign开启Hystrix降级一样,还是可以使用fallback属性
3、编写降级类
/*熔断*/
@Component
public class userFallback implements FallbackFactory<UserFeigoncCients> {
//限流降级
@Override
public UserFeigoncCients create(Throwable throwable) {
return new UserFeigoncCients() {
@Override
public User user(Long id) {
return new User(-1l,"熔断了");
}
};
}
}
到这里我们已经完成了Feign和Sentinel的兼容使用,是不是很简单呢,因为它的集成方式和Hystrix简直一模一样
总结
本文对SpringCloud Alibaba的组件Nacos(配置管理) 、Sentienl(限流) 和Sentinel(流控) 做详细介绍学习,欢迎评论区讨论交流。,文章如有雷同纯属巧合,如需转载请私信联系,本文为Java技术小白,日常分享学习心得,欢迎您的探讨和交流。