Alibaba微服务组件 - Sentinel(五) 整合openfeign + 规则持久化

5. 整合openfeign + 规则持久化

5.1 整合openfeign进行降级

image

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 将规则推送至客户端并直接更新到内存中:
image

这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。

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
    }
]

image

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配置中心生成对应的配置。

image

posted @ 2022-04-14 16:18  xiexie0812  阅读(293)  评论(0编辑  收藏  举报