SentinelDashboard-Nacos动态数据源-SpringCloudGateway

Sentinel-Dashboard 添加配置Nacos持久化,权限控制扩展 Sentinel-Dashboard添加配置Nacos持久化 阅读详情

友情提示:要下载源码进行改造,本文基于Sentinel-1.8.2。

以下内容摘自个人的技术文档,相关资料主要来自SpringCloudAlibaba和Github-Sentinel。正文是部分节选内容,仅供参考。

4.1.2. 网关流控

网关限流规则,是针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。

与普通的应用流控相同,网关流控触发后同样会返回这样的结果。

{
    "code":429,
    "message":"Sentinel block exception",
    "route":"/"
}
4.1.2.1. 基础结构

前端代码

  • 前端页面:webapp/resources/app/views/gateway/flow.html
  • js文件:webapp/resources/app/scripts/controllers/gateway/flow.js

后台代码

  • Package:com.alibaba.csp.sentinel.dashboard.controller.gateway
  • Class:GatewayFlowRuleController
    • GET /gateway/flow/list.json - 查询流控规则
    • POST /gateway/flow/new.json - 新增流控规则
    • PUT /gateway/flow/save.json - 修改流控规则
    • DELETE /gateway/flow/delete.json - 删除流控规则
4.1.2.2. 查询流控规则

接口入参

参数名类型规则约束说明
appString字符串非空gateway网关ApplicationName,对应网关配置文件中spring.application.name属性的值
ipString字符串非空网关服务器IP
portInteger非空网关服务器端口,对应网关配置文件中sentinel.transport.port的值

内部逻辑

在这里插入图片描述

4.1.2.3. 新增流控规则

接口入参

参数名类型规则约束说明
appString字符串非空应用名称
ipString字符串非空应用IP
portInteger应用端口号
resourceString字符串非空流控针对的资源
resourceModeInteger非空,RESOURCE_MODE_ROUTE_ID=0;RESOURCE_MODE_CUSTOM_API_NAME=1资源模式
gradeInteger非空,0为线程数,1为qps限流指标维度,同限流规则的 grade 字段
countDouble大于等于0限流阈值
intervalLong大于0统计间隔,默认是 1
intervalUnitInteger秒、分、时、天统计间隔单位,默认是秒
controlBehaviorInteger非空,0-快速失败 2-匀速排队流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
burstInteger快速失败时必填,大于等于0应对突发请求时额外允许的请求数目
maxQueueingTimeoutMsInteger匀速排队时必填,大于等于0匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效
paramItemGPFIV参数限流配置

GPFIV:GatewayParamFlowItemVo若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。

参数名类型规则约束说明
parseStrategyInteger0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie从请求中提取参数的策略
fieldNameString当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称
patternString参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。(1.6.2 版本开始支持)
matchStrategyInteger精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)、正则匹配(PARAM_MATCH_STRATEGY_REGEX)参数值的匹配策略(1.6.2 版本开始支持)

内部逻辑
在这里插入图片描述

4.1.2.4. 修改流控规则

接口入参

除了用id替代了部分参数外,其他参数都与新增接口的入参相同

参数名类型规则约束说明
idLong非空规则id
gradeInteger非空,0为线程数,1为qps限流指标维度,同限流规则的 grade 字段
countDouble大于等于0限流阈值
intervalLong大于0统计间隔,默认是 1
intervalUnitInteger秒、分、时、天统计间隔单位,默认是秒
controlBehaviorInteger非空,0-快速失败 2-匀速排队流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
burstInteger快速失败时必填,大于等于0应对突发请求时额外允许的请求数目
maxQueueingTimeoutMsInteger匀速排队时必填,大于等于0匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效
paramItemGPFIV参数限流配置

内部逻辑(与新增相同)

4.1.2.5. 删除流控规则

接口入参

参数名类型规则约束说明
idLong非空规则id

内部逻辑(大致与新增、修改相同,不再赘述)

5. 动态数据源

5.1. 前置知识

5.1.1. 什么是动态数据源

开源框架中(至少截止1.8.2版本),所有的规则都是存储在内存中(JVM中以Map形式存在)。但是在生产环境中,我们通常希望有一个固定的配置文件或者数据源来完成这些规则的持久化及使用,这就是动态数据源。

本项目是Sentinel Dashboard,而不是Sentinel。由于Dashboard提供了比较完善的规则管理功能,所以我们期望通过Dashboard来进行规则配置,而不是通过Nacos这样的配置中心对文本进行修改。那么,为了满足这样的需求,就需要把动态数据源集成入Dashboard中,从而将用户在Dashboard中配置的规则持久到动态数据源中。

Sentinel(也包括Dashboard)提供了两种动态数据源方案:

  • 拉模式,客户端(集成Sentinel的应用)主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;

  • 推模式,规则中心统一推送,客户端(集成Sentinel的应用)通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
    在这里插入图片描述

Sentinel 目前支持以下数据源扩展:

5.1.2. 拉模式拓展

实现拉模式的数据源最简单的方式是继承 AutoRefreshDataSource 抽象类,然后实现 readSource() 方法,在该方法里从指定数据源读取字符串格式的配置数据。比如 基于文件的数据源。

5.1.3. 推模式拓展

实现推模式的数据源最简单的方式是继承 AbstractDataSource 抽象类,在其构造方法中添加监听器,并实现 readSource() 从指定数据源读取字符串格式的配置数据。比如 基于 Nacos 的数据源。

控制台通常需要做一些改造来直接推送应用维度的规则到配置中心。功能示例可以参考 AHAS Sentinel 控制台的规则推送功能。改造指南可以参考 在生产环境中使用 Sentinel 控制台。

5.1.4. 注册数据源

本小节内容是单独使用Sentinel时需要做的步骤,如果使用SpringCloudAlibaba集成Sentinel,则不需要。

通常需要调用以下方法将数据源注册至指定的规则管理器中:

ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId, parser);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

若不希望手动注册数据源,可以借助 Sentinel 的 InitFunc SPI 扩展接口。只需要实现自己的 InitFunc 接口,在 init 方法中编写注册数据源的逻辑。比如:

package com.test.init;

public class DataSourceInitFunc implements InitFunc {

    @Override
    public void init() throws Exception {
        final String remoteAddress = "localhost";
        final String groupId = "Sentinel:Demo";
        final String dataId = "com.alibaba.csp.sentinel.demo.flow.rule";

        ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,
            source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }
}

接着将对应的类名添加到位于资源目录(通常是 resource 目录)下的 META-INF/services 目录下的 com.alibaba.csp.sentinel.init.InitFunc 文件中,比如:

com.test.init.DataSourceInitFunc

这样,当初次访问任意资源的时候,Sentinel 就可以自动去注册对应的数据源了。

5.1.5. 官方拓展示例

Sentinel官方在源码中提供了针对应用流控规则的动态数据源拓展示例。Sentinel开源版提供了基于内存的规则引擎,为了使用数据源进行持久化,有必要对其进行改造。

官方针对Nacos作为动态数据源的情况写了专门的样本代码,该样本针对的是流控规则。

回顾一下流控规则的后台代码:

  • Package:com.alibaba.csp.sentinel.dashboard.controller
  • Class:FlowControllerV1
    • GET /v1/flow/rules - 查询流控规则
    • POST /v1/flow/rule - 新增流控规则
    • PUT /v1/flow/save.json - 修改流控规则
    • DELETE /v1/flow/delete.json - 删除流控规则

样本代码则是:

  • Package:com.alibaba.csp.sentinel.dashboard.controller.v2
  • Class:FlowControllerV2
    • GET /v2/flow/rules - 查询流控规则
    • POST /v2/flow/rule - 新增流控规则
    • PUT /v2/flow/save.json - 修改流控规则
    • DELETE /v2/flow/delete.json - 删除流控规则

Sentinel官方在dashboard的test包中提供了nacos的关键样例(test/com.alibaba.csp.sentinel.dashboard.rule.nacos),也包括了Apollo和Zookeeper。以下主要介绍基于Nacos作为动态数据源如何操作。

5.1.5.1. 拷贝样例类

位于test/com.alibaba.csp.sentinel.dashboard.rule.nacos下,有4个类:

  • FlowRuleNacosProvider
  • FlowRuleNacosPublisher
  • NacosConfig
  • NacosConfigUtil

将它们拷贝到SentinelDashboard中。由于NacosConfig中填写的Nacos服务地址是localhost,我们要改为ip:port的格式,通常我们会将它定义个配置项,挪到配置文件中定义或者用启动参数指定。

5.1.5.2. 添加数据源依赖

由于官方将数据源依赖设置为了test范围,我们需要将其开放使用,只要将pom.xml中下面的< scope>标签注释掉即可。

		<!-- for Nacos rule publisher sample -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <scope>test</scope>
        </dependency>
5.1.5.3. 修改前端路由

默认前端访问的后端接口上面提到了,是这些:

  • GET /v1/flow/rules - 查询流控规则
  • POST /v1/flow/rule - 新增流控规则
  • PUT /v1/flow/save.json - 修改流控规则
  • DELETE /v1/flow/delete.json - 删除流控规则

现在要改为/v2/……,所以要把前端改造一下。虽然前端是Angular开发的,但对于全栈来说,不用担心看看就知道是怎么回事。

Angular和Vue差不多,需要用node.js进行编译打包之类的操作,所以这里需要安装node.js,建议使用11.15.0,否则可能会遇到一些奇奇怪怪的问题。如果希望同时管理多个node版本,可以参考这篇博客。

node相关命令:

# 安装包
npm -install

# 运行(开发)
npm start

# 打包(生产)
npm run build

前端工程的结构大概是这样的(只摘录必要的结构,其他的已省略):

  • webapp/resources/

    • app

      • scripts
        • controllers
          • flow_v1.js ------------------------------ 原始流控前端js
          • flow_v2.js ------------------------------ 动态数据源前端js
        • services
          • flow_service_v1.js ------------------- 原始流控后端API定义
          • flow_service_v2.js ------------------- 动态数据源后端API定义
        • directives
          • sidebar
            • sidebar.html --------------------- 定义路由
        • app.js ------------------------------------------ 定义全局的控件,是核心配置
      • views
        • flow_v1.html --------------------------------- 原始流控规则配置页面
        • flow_v2.html --------------------------------- 动态数据源流控规则配置页面
    • dist ---------------------------------------------------------- 存放生产环境编译打包后的文件

    • tmp ---------------------------------------------------------- 存放开发环境编译打包后的文件

    • gulpfile.js -------------------------------------------------- service 文件定义的地方(后续扩展新的代码要用)

此处有两个关键,app.js和sidebar.html,在app.js中定义了两个state,是我们可以直接用的,内容如下:

      .state('dashboard.flowV1', {
        templateUrl: 'app/views/flow_v1.html',
        url: '/flow/:app',
        controller: 'FlowControllerV1',
        resolve: {
          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
            return $ocLazyLoad.load({
              name: 'sentinelDashboardApp',
              files: [
                'app/scripts/controllers/flow_v1.js',
              ]
            });
          }]
        }
      })

      .state('dashboard.flow', {
          templateUrl: 'app/views/flow_v2.html',
          url: '/v2/flow/:app',
          controller: 'FlowControllerV2',
          resolve: {
              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
                  return $ocLazyLoad.load({
                      name: 'sentinelDashboardApp',
                      files: [
                          'app/scripts/controllers/flow_v2.js',
                      ]
                  });
              }]
          }
      })

对应的,控制台左侧的导航中的连接,则是在sidebar.html中定义:

<!-- 原始流控规则导航 -->
<li ui-sref-active="active" ng-if="!entry.isGateway">
	<a ui-sref="dashboard.flowV1({app: entry.app})">
	<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
</li>
<!-- 改成动态数据源流控规则导航 -->
<li ui-sref-active="active" ng-if="!entry.isGateway">
	<a ui-sref="dashboard.flow({app: entry.app})">
	<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>

很显然标签中的dashboard.flowV1就是app.js中state所定义的组件。

前端改好后,可以直接启动或者打包后启动来调试,看看是否成功。

5.2. 基于SpringCloudGateway

SpringCloudGateway由于Sentinel官方已经做好了适配,所以集成起来还是比较简单。

Gateway相关的代码基本都在gateway包或者目录下,很好找。

此处为了保留原始代码,基本上都是新建类、页面和js等进行扩展,不在原有代码上直接改,以下仅针对流控过程扩展供参考。

5.2.1. 新增Publisher和Provider

根据原始的GatewayFlowRuleController,可以知道,接口内使用的实体对象都是GatewayFlowRuleEntity,所以直接为它提供转换器并编写Publisher和Provider即可。

Provider

import com.alibaba.csp.sentinel.dashboard.config.NacosConfigUtil;
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.util.StringUtil;
import com.alibaba.nacos.api.config.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component("gatewayFlowRuleNacosProvider")
public class GatewayFlowRuleNacosProvider implements DynamicRuleProvider<List<GatewayFlowRuleEntity>> {
    @Autowired
    private ConfigService configService;
    // 规则对象的转换器,获取到的数据根据使用的数据类型的不同,需要用不同的转换器转化后使用
    @Autowired
    private Converter<String, List<GatewayFlowRuleEntity>> converter;

    @Override
    public List<GatewayFlowRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + NacosConfigUtil.FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>(0);
        }
        return converter.convert(rules);
    }
}

Publisher

import com.alibaba.csp.sentinel.dashboard.config.NacosConfigUtil;
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.util.AssertUtil;
import com.alibaba.nacos.api.config.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * <h3>Sentinel动态数据源的网关流控规则发布器</h3>
 *
 * <p>把通过控制台配置好的规则发布到动态数据源(nacos)中,当前使用的是push模式,
 * 规则被推送至nacos后,网关将会通过监听器自动获取最新的规则,并更新到网关的本地缓
 * 存中。
 * </p>
 */
@Component("gatewayFlowRuleNacosPublisher")
public class GatewayFlowRuleNacosPublisher implements DynamicRulePublisher<List<GatewayFlowRuleEntity>> {
    // 数据源的配置服务
    @Autowired
    private ConfigService configService;
    /**
     * <p>数据通信的转换器。
     * <p>在config包下的NacosConfig类中声明的Spring Bean对象。
     * <p>负责将实体对象转换为json格式的字符串</p>
     */
    @Autowired
    private Converter<List<GatewayFlowRuleEntity>, String> converter;

    @Override
    public void publish(String app, List<GatewayFlowRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        /*
         * 将规则发布到动态数据源作持久化,第一个参数是app+后缀,此处用的是-flow-rules的后缀;
         * 第二个参数是nacos分组id,这个用默认提供的sentinel预留项即可;最后一个参数是数据转换
         * 器,要将对象转换成统一的格式后,网络传输到nacos。
         */
        configService.publishConfig(app + NacosConfigUtil.FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, converter.convert(rules));
    }
}

5.2.2. 添加Converter

添加一个Converter<List< GatewayFlowRuleEntity>, String>类型的转换器,可以直接在前面拷贝的NacosConfig中添加:

@Bean
public Converter<List<GatewayFlowRuleEntity>, String> gatewayFlowRuleEntityEncoder() {
	return JSON::toJSONString;
}

@Bean
public Converter<String, List<GatewayFlowRuleEntity>> gatewayFlowRuleEntityDecoder() {
	return s -> JSON.parseArray(s, GatewayFlowRuleEntity.class);
}

5.2.3. GatewayFlowRuleControllerV2

  1. 新增一个GatewayFlowRuleControllerV2,内容可以直接拷贝GatewayFlowRuleController。

  2. 将原来的接口地址改一下:/gateway/flow -> /v2/gateway/flow

  3. 去掉原来的sentinelApiClient

    @Autowired
    private SentinelApiClient sentinelApiClient;
    
  4. 加入Provider和Publisher

    @Autowired
    @Qualifier("gatewayFlowRuleNacosProvider")
    private DynamicRuleProvider<List<GatewayFlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("gatewayFlowRuleNacosPublisher")
    private DynamicRulePublisher<List<GatewayFlowRuleEntity>> rulePublisher;
    
  5. 修改publishRules()方法

    private boolean publishRules(String app, String ip, Integer port) {
    	List<GatewayFlowRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
        return sentinelApiClient.modifyGatewayFlowRules(app, ip, port, rules);
    }
    // 改为
    
        /**
         * <h3>发布规则统一逻辑</h3>
         *
         * <p>规则都是存在本地内存中的,先从内存中获取所有当前要发布规则应用的规则,是一个List</p>
         * <p>将全量的规则以一定的格式发布到数据源中,进行统一更新</p>
         *
         * @param app 应用名称
         * @param ip 应用IP
         * @param port 应用端口
         * @throws Exception 远程发布,会发生异常,要进行异常处理
         */
        private void publishRules(String app, String ip, Integer port) throws Exception {
            List<GatewayFlowRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
            rulePublisher.publish(app, rules);
        }
    
  6. 修改controller中的逻辑,主要针对读取规则和保存规则两块:

    • queryFlowRules

      List<GatewayFlowRuleEntity> rules = sentinelApiClient.fetchGatewayFlowRules(app, ip, port).get();
      // 改为
      List<GatewayFlowRuleEntity> rules = ruleProvider.getRules(app);
      
    • addFlowRule

      try {
      	entity = repository.save(entity);
      } catch (Throwable throwable) {
      	logger.error("add gateway flow rule error:", throwable);
      	return Result.ofThrowable(-1, throwable);
      }
      
      if (!publishRules(app, ip, port)) {
      	logger.warn("publish gateway flow rules fail after add");
      }
      // 改为
      try {
          entity = repository.save(entity);
          publishRules(entity.getApp(), entity.getIp(), entity.getPort());
      } catch (Throwable throwable) {
          logger.error("add gateway flow rule error:", throwable);
          return Result.ofThrowable(-1, throwable);
      }
      
    • updateFlowRule(与addFlowRule类似)

    • deleteFlowRule(与addFlowRule类似)

5.2.4. 前端改造

  1. 在app.js中定义新的gateway state

    // 新增的state
    	.state('dashboard.gatewayFlowV2', {
              templateUrl: 'app/views/gateway/flow_v2.html',
              url: '/gateway/flow/:app',
              controller: 'GatewayFlowCtlV2',
              resolve: {
                  loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
                      return $ocLazyLoad.load({
                          name: 'sentinelDashboardApp',
                          files: [
                              'app/scripts/controllers/gateway/flow_v2.js',
                          ]
                      });
                  }]
              }
          })
    
    // 这是原来的,在最底部
          .state('dashboard.gatewayFlow', {
              templateUrl: 'app/views/gateway/flow.html',
              url: '/gateway/flow/:app',
              controller: 'GatewayFlowCtl',
              resolve: {
                  loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
                      return $ocLazyLoad.load({
                          name: 'sentinelDashboardApp',
                          files: [
                              'app/scripts/controllers/gateway/flow.js',
                          ]
                      });
                  }]
              }
          });
    
  2. 改造sidebar.html,添加新导航到新的controller,旧的注释掉

    <li ui-sref-active="active" ng-if="entry.isGateway">
    	<a ui-sref="dashboard.gatewayFlowV2({app: entry.app})">
    	<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;网关流控规则</a>
    </li>
    
  3. 新增一个网关流控页面,views/gateway/flow_v2.html

  4. 拷贝controllers/gateway/flow.js -> controllers/gateway/flow_v2.js,只改带V2的地方即可

    app.controller('GatewayFlowCtlV2', ['$scope', '$stateParams', 'GatewayFlowServiceV2', 'GatewayApiService', 'ngDialog', 'MachineService',
      function ($scope, $stateParams, GatewayFlowServiceV2, GatewayApiService, ngDialog, MachineService) {
    
  5. 拷贝services/gateway/flow_service_v1.js -> services/gateway/flow_service_v2.js

    app.service('FlowServiceV2', ['$http', function ($http) {
    

    FlowService改为 FlowServiceV2,然后把所有的请求路径加上 /v2 前缀

  6. gulpfile.js中添加FlowServiceV2的定义:

    const JS_APP = [
    	……,
    	'app/scripts/services/gateway/flow_service_v2.js',
    ]
    
  7. 执行npm run build,清空浏览器缓存后测试即可。

Sentinel dashboard持久化,持久化到nacos和数据库中(基于sentinel 1.8.2) 我们知道,Sentinel dashboard默认是是没有持久化功能的,都是保存在内存中的,对于sentinel客户端同样如此,当在sentinel dashboard配置规则的时候,dashboard会获取对应应用配置的dashboard给应用传递消息的http,将规则通过HTTP请求发送给sentinel客户端,同样,sentinel客户端也是没有持久化的都是放在内存中的。 sentinel dashbord通过HTTP向sentinel客户端获取客户端的限流配置,而在dashboard更新配置之后则通 阅读详情

相关推荐

Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱Java互联网工程师面试1000题。

2401_83916355的博客 1122

Sentinel Dashboard集成Nacos

Sentinel Dashboard集成Nacos案例

黎鉴洪的博客 2110

sentinel与nacos集成

sentinel与nacos集成实战

demon7552003的小本本 3202

sentinel-dashboard1.8.4配置持久化到nacos保姆级教程

sentinel-dashboard配置推送到nacos最最全面的保姆级教程以及过程解析分析,包你一看就懂,一学就会

litianyu0730的博客 3919

Sentinel系列-Sentinel控制台(dashboard)

Sentinel 控制台 概述 Sentinel 提供一个轻量级的开源控制台,它提供服务发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。另外,鉴权在生产环境中也必不可少。这里,我们将会详细讲述如何通过简单的步骤就可以使用这些功能。 Sentinel 控制台包含如下功能: 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断服务是否在线。 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时

chongbaozhong的博客 2万+

别再硬编码了!Flowable工作流动态审批人配置全解析(Spring Boot集成版)

本文深入解析Flowable工作流在Spring Boot中的动态审批人配置技术,通过角色、部门等变量实现审批流程的灵活设计。文章详细介绍了架构原理、前端配置映射、动态候选组解析及查询优化方案,帮助企业提升审批流程的适应性和维护效率。

weixin_30919571的博客 135

Sentinel Dashboard 接入 Nacos 动态数据源 & Zuul 接入 Sentinel 实战

Sentinel Dashboard 接入 Nacos 动态数据源 & Zuul 接入 Sentinel 实战

Howinfun的博客 1261

北京联通IPTV组播实战:OpenWRT软路由配置全解析

本文详细解析了在北京联通IPTV环境下,利用OpenWRT软路由和udpxy工具实现组播转单播的实战配置。内容涵盖网络接口设置、防火墙规则、udpxy安装配置、直播源M3U文件处理以及全平台播放指南,帮助用户无需机顶盒即可在家庭局域网内任何设备上流畅观看电视直播。

weixin_29313547的博客 1407

sentinel + nacos 超详细使用步骤

sentinel + nacos 超详细使用步骤

The_mighty_tiger的博客 5197

不只是CPU主频:深入解析英飞凌Aurix TC3xx各外设时钟树(CAN、以太网、Flash时序如何配置)

本文深入解析英飞凌Aurix TC3xx系列微控制器的外设时钟树配置,涵盖CAN、以太网和Flash时序的优化方法。通过详细分析时钟系统架构、关键外设配置及多外设协同设计策略,帮助工程师实现高性能汽车电子控制单元(ECU)开发。特别关注系统时钟的灵活配置与EMC优化技巧,提升系统实时性和可靠性。

weixin_29189373的博客 400

Python实战:用Sinkhorn算法搞定最优传输问题(附完整代码)

本文详细介绍了如何使用Python实现Sinkhorn算法解决最优传输问题,包括算法原理、关键步骤和完整代码示例。通过实际案例(如图像颜色迁移)展示其高效性和稳定性,适合机器学习开发者和数据科学家应用于分布匹配等场景。

weixin_30879169的博客 98

Sentinel dashboard规则持久化到nacos改造

修改Sentinel dashboard源码,使规则配置持久化到nacos中

Hello Java 1113

手把手教你利用qemu搭建银河麒麟V11 arm环境

在Windows环境下,初学者或企业用户常通过VMware、VirtualBox等虚拟机软件安装Ubuntu、Red Hat等Linux系统,这类工具更侧重X86等复杂指令集架构(CISC,常见于Intel、AMD处理器)的虚拟化。而QEMU是一款开源的虚拟机监视器与模拟器,核心优势在于可模拟ARM、MIPS、RISC-V等精简指令集架构(RISC)的处理器并提供虚拟化能力,更适合对虚拟化技术有一定了解的用户。可能是电脑性能问题,安装过程比较慢,需要耐心等待。等操作系统下载完成后,进行安装了。

huanhuanzhou blog 2455

Sentinel-Dashboard-1.8持久化Nacos全网最详细讲解(包含客户端)

*耗时2天(我的元旦假期啊~~~~),针对Sentinel-Dashboard1.8的源码进行修改。 目前已打包并上传优快云资源。如果你不想看这长篇大论的话。* 资源地址:https://download.youkuaiyun.com/download/u014386444/14003226 本人因为经常下载资源,积分用完了。。。我看其他人在优快云都需要3、40积分,5积分应该不算多吧。。当然如果你和我一样没积分了。联系我,免费发你。 最后一句废话,如果帮到你,我们学学老外。共享知识,互相学习进步~ 现在开始正题。

铁蛋的博客 5003

汽车UDS诊断详解及Vector相关工具链使用说明——总述

1.什么是诊断 车辆在运行过程中,不可避免地会发生一些故障,为了确保行车安全,我们要求车上的ECU能够实时监测部件的运行状态,一旦发现异常情况,能通过点亮报警灯等方式提示驾驶员。但是,点亮报警灯只能告诉驾驶员车辆发生了故障,最多只能定位到故障ECU,比如ABS报警灯亮说明ABS系统出现故障,但具体是什么部件发生故障并不能通过报警灯显示出来。这时就需要ECU在本地存储一个与故障相对应的故障代码,在进行维修的时候,可以通过车上的OBD接口连接诊断仪,把这个存储的故障代码读取出来,从而进一步定位到更加具体的故障部

weixin_42967006的博客 2万+

Apache Kafka Connect任意文件读取漏洞(CVE-2025-27817)

由于Apache Kafka客户端未对用户输入进行严格验证和限制,未经身份验证的攻击者可通过构造恶意配置读取环境变量或磁盘任意内容,或向非预期位置发送请求,提升REST API的文件系统/环境/URL访问权限。(CVE-2025-27817)

iSee857的博客 2026

Sentinel Dashboard支持规则配置持久化至Nacos

Sentinel控制台本身不支持规则配置持久化到Nacos,这里我们对Sentinel控制台的源代码进行了一些修改,支持限流和降级规则同步到Nacos。

lingbomanbu_lyl的博客 1878

昇腾AI原生创新算子挑战赛(S1赛季)复盘-LessEqual算子

【代码】昇腾AI原生创新算子挑战赛(S1赛季)复盘-LessEqual算子。

william_myq的博客 507

Nacos--源码剖析 Sentinel Dashboard--数据持久化

Nacos--源码剖析 Sentinel Dashboard--数据持久化

难拳的博客 927

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Sentinel Dashboard 规则持久化Nacos

Sentinel Dashboard 规则持久化Nacos2025-12-5日作 目前sentinel已经更新到1.8.9版本,作者使用目前最新版演示sentinel操作。

NightMare_s的博客 469

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Sentinel集成Nacos实现动态流控规则

Sentinel的理念是只需要开发者关注资源的定义,它默认会对资源进行流控。当然,我们还是需要对定义的资源设置流控规则,主要有两种方式: 通过FlowRuleManager.loadRules()手动加载流控规则。 在Sentinel Dashboard上针对资源动态创建流控规则。 针对第一种方式,如果接入Sentinel Dashboard,那么同样支持动态修改流控规则,但是基于Senti...

吴大侠的博客 565

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SpringCloudGateway集成Sentinel

SpringCloudGateway集成Sentinel 介绍 Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。 Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。(https://github.com/alibaba/Sentinel) 整体结构图如下,将原有的 Spring Cloud G

Fouse_的博客 6944

Sentinel1.8.6 Gateway网关流控+动态Nacos数据源双向持久化

大家也知道,SpringCloud架构的微服务项目—可以说网关是必不可少的,其中SpringCloud gateway最受欢迎,无缝集成,所有请求都会先进入Gateway,由Gateway进行路由转发。你想想,sentinel默认配置的流控规则都是存储在dashboard服务内存中的,项目一重启,那么你之前配置的流控规则都没了!注意,重点就是在Publisher(Nacos发布者)和Provider(Nacos发布者)这两个类,需要重写,Sentinel是支持网关流控控台的,所以我们需要重写。

jack2350536098的博客 5164

(企业案例)使用Nacos持久化规则,改造sentinel-dashboard

文章目录一、前言1. 版本选取2. 克隆代码3. 导入 IDEA二、全局修改2.1. 修改 POM2.2. 修改配置文件三、后端代码修改3.1. 包结构部分3.2. nacos 配置文件创建授权规则与 Nacos 交互类创建降级规则与 Nacos 交互类 一、前言 1. 版本选取 要想改造 sentinel-dashboard,需要修改 dashboard 的源码。(本文基于sentinel 1.8.2) 2. 克隆代码 先通过 Github 拉取 Sentinel 源码,GitHub 地址:https:/

Gblfy_Blog 2115

使用Gateway网关配合sentinel-dashboard使用nacos同步数据-打docker镜像

使用Gateway网关配合sentinel-dashboard使用nacos同步数据-打docker镜像 克隆sentinel-dashboard到本地:https://github.com/alibaba/Sentinel/ 开始修改代码: 修改pom.xml中的sentinel-datasource-nacos的依赖,将<scope>test</scope>注释掉,这样才能在主程序中使用。 <dependency> <groupId>c

邪神大人 1532
上一篇: Windows下管理多版本nodejs
下一篇: Docker-部署运行MySQL容器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值