Alibaba微服务组件 - Sentinel(五) 整合openfeign + 规则持久化
5. 整合openfeign + 规则持久化
5.1 整合openfeign进行降级
5.1.1 引入依赖
<!--集成alibaba-sentinel 启动器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>
5.1.2 加入配置
# 开启openfeign支持sentinel
feign:
sentinel:
enabled: true
5.1.3 代码实现
openfegin接口
@FeignClient(value = "nacos‐payment‐provider",fallback =ConsumerFallBackService.class )
public interface ConsumerService {
@GetMapping(value = "/paymentSQL/{id}")
public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id);
}
openfegin的fallback实现类
@Component
public class ConsumerFallBackService implements ConsumerService {
@Override
public CommonResult<Payment> paymentSQL(Long id) {
return new CommonResult<Payment>("500","进入兜底方法‐‐‐ConsumerFallBackService",null);
}
}
5.2 sentinel持久化
5.2.1 Sentinel持久化模式
推送模式 | 说明 | 优点 | 缺点 |
---|---|---|---|
原始模式 | API 将规则推送至客户端并直接更新到内存中,扩展写数据源 (WritableDataSource ) | 简单,无任何依赖 | 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境 |
Pull 模式 | 扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件等 | 简单,无任何依赖;规则持久化 | 不保证一致性;实时性不保证,拉取过 于频繁也可能会有性能问题。 |
Push 模式 | 扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 | 规则持久化;一致性;快速 | 引入第三方依赖 |
5.2.2 原始模式
如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中:
这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。
5.2.3 拉模式
pull 模式的数据源(如本地文件、RDBMS 等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager
,将写数据源注册至 transport
的WritableDataSourceRegistry
中。
5.2.4 推模式
生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel
,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:
5.2.5 基于Nacos配置中心控制台实现推送
官方demo: sentinel-demo-nacos-datasource
5.2.5.1 引入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
5.2.5.2 nacos配置中心中配置流控规则
nacos配置中心中配置流控规则
[
{
"resource": "TestResource",
"controlBehavior": 0,
"count": 10,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
5.2.5.3 yml中配置
server:
port: 8070
main:
allow-bean-definition-overriding: true
spring:
application:
# name: order-sentinel
name: mall‐user‐sentinel‐rule‐push‐demo #微服务名称
cloud:
nacos:
server-addr: 127.0.0.1:8848
sentinel:
transport:
# 添加sentinel的控制台地址
dashboard: 127.0.0.1:8858
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
# port: 8719
web-context-unify: false # 默认将调用链路收敛,需要打开才可以进行链路流控
datasource:
# ds1:
# nacos:
# server‐addr: 127.0.0.1:8848
# dataId: ${spring.application.name}
# groupId: DEFAULT_GROUP
# data‐type: json
# ruleType: flow
flow‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐flow‐rules
groupId: SENTINEL_GROUP # 注意groupId对应Sentinel Dashboard中的定义
data‐type: json
rule‐type: flow
degrade‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐degrade‐rules
groupId: SENTINEL_GROUP
data‐type: json
rule‐type: degrade
param‐flow‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐param-flow‐rules
groupId: SENTINEL_GROUP # 注意groupId对应Sentinel Dashboard中的定义
data‐type: json
rule‐type: param‐flow
authority‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐authority‐rules
groupId: SENTINEL_GROUP # 注意groupId对应Sentinel Dashboard中的定义
data‐type: json
rule‐type: authority
system‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐system‐rules
groupId: SENTINEL_GROUP # 注意groupId对应Sentinel Dashboard中的定义
data‐type: json
rule‐type: system
# 开启openfeign支持sentinel
feign:
sentinel:
enabled: true
5.2.5.4 以流控规则测试,当在sentinel dashboard配置了流控规则,会在nacos配置中心生成对应的配置。
欢迎一起来学习和指导,谢谢关注!
本文来自博客园,作者:xiexie0812,转载请注明原文链接:https://www.cnblogs.com/mask-xiexie/p/16145215.html