Sentinel nacos spring cloud 持久化配置---分布式/微服务流量控制

文章目录

  • sentinel控制台安装
  • 目标
  • 实现代码地址
  • 版本说明
  • maven spring-cloud-starter-alibaba-sentinel依赖
  • yml文件
  • Nacos业务规则配置
  • 看源码配置规则
    • SentinelProperties 总配置加载
    • DataSourcePropertiesConfiguration 配置
    • 标准的nacos配置
    • 注册具体sentinel配置
  • 外传

sentinel控制台安装

下载地址:https://github.com/alibaba/Sentinel/releases

本次版本:1.8.6
上一篇文章已介绍

目标

我们先说目标,为各位看官节省不匹配的时间
0、使用sentinel流控中心
1、使用nacos做配置中心
5、使用spring-cloud-starter-alibaba-sentinel做持久化配置

实现代码地址

https://github.com/OrderDong/microservice-boot
分支:microservice-boot-1.0.5-sentinel
当然,用springboot sentinel starter 使用nacos配置也是一样效果,不过需要自己实现,另一篇文章有参考
在这里插入图片描述

版本说明

Dubbo :3.1.0
Springboot:2.3.1.RELEASE
sentinel:1.8.6
Nacos-config:0.2.10

maven spring-cloud-starter-alibaba-sentinel依赖

https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel/


<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2021.1</version>
</dependency>

yml文件

配置nacos datasource时可能不会给提示,我们直接看源码怎么加载的

spring:application:name: sentinelcloud:sentinel:transport:dashboard: localhost:7080 # 配置Sentinel dashboard地址heartbeat-interval-ms: 500client-ip: localhost:8719 # 配置Sentinel api地址datasource:ds1:nacos: # 关注点,添加Nacos数据源配置server-addr: localhost:8848dataId: cloudalibaba-sentinel-plat-servergroupId: DEFAULT_GROUPdata-type: jsonrule-type: flow

Nacos业务规则配置

[{"resource": "sayHello","limitApp": "default","grade": 1,"count": 5, "strategy": 0,"controlBehavior": 0,"clusterMode": false}
]

看源码配置规则

SentinelProperties 总配置加载

package com.alibaba.cloud.sentinel;import com.alibaba.cloud.sentinel.datasource.config.DataSourcePropertiesConfiguration;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;@ConfigurationProperties(prefix = "spring.cloud.sentinel"
)
@Validated
public class SentinelProperties {private boolean eager = false;private boolean enabled = true;private String blockPage;//重点是这个private Map<String, DataSourcePropertiesConfiguration> datasource;

DataSourcePropertiesConfiguration 配置

支持很多中分布式配置中间件,我们重点关注nacos

public class DataSourcePropertiesConfiguration {private FileDataSourceProperties file;private NacosDataSourceProperties nacos;private ZookeeperDataSourceProperties zk;private ApolloDataSourceProperties apollo;private RedisDataSourceProperties redis;private ConsulDataSourceProperties consul;public DataSourcePropertiesConfiguration() {}//-----省略-----@JsonIgnorepublic List<String> getValidField() {return (List)Arrays.stream(this.getClass().getDeclaredFields()).map((field) -> {try {return !ObjectUtils.isEmpty(field.get(this)) ? field.getName() : null;} catch (IllegalAccessException var3) {return null;}}).filter(Objects::nonNull).collect(Collectors.toList());}@JsonIgnorepublic AbstractDataSourceProperties getValidDataSourceProperties() {List<String> invalidFields = this.getValidField();if (invalidFields.size() == 1) {try {this.getClass().getDeclaredField((String)invalidFields.get(0)).setAccessible(true);return (AbstractDataSourceProperties)this.getClass().getDeclaredField((String)invalidFields.get(0)).get(this);} catch (IllegalAccessException var3) {} catch (NoSuchFieldException var4) {}}return null;}
}

标准的nacos配置

package com.alibaba.cloud.sentinel.datasource.config;import com.alibaba.cloud.sentinel.datasource.factorybean.NacosDataSourceFactoryBean;
import javax.validation.constraints.NotEmpty;
import org.springframework.util.StringUtils;public class NacosDataSourceProperties extends AbstractDataSourceProperties {private String serverAddr;private String username;private String password;@NotEmptyprivate String groupId = "DEFAULT_GROUP";@NotEmptyprivate String dataId;private String endpoint;private String namespace;private String accessKey;private String secretKey;public NacosDataSourceProperties() {super(NacosDataSourceFactoryBean.class.getName());}public void preCheck(String dataSourceName) {if (StringUtils.isEmpty(this.serverAddr)) {this.serverAddr = this.getEnv().getProperty("spring.cloud.sentinel.datasource.nacos.server-addr", "localhost:8848");}}

注册具体sentinel配置

我们直接看下AbstractDataSourceProperties抽象数据源配置


//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.alibaba.cloud.sentinel.datasource.config;import com.alibaba.cloud.sentinel.datasource.RuleType;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.datasource.AbstractDataSource;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.springframework.core.env.Environment;public class AbstractDataSourceProperties {@NotEmptyprivate String dataType = "json";@NotNullprivate RuleType ruleType;private String converterClass;@JsonIgnoreprivate final String factoryBeanName;@JsonIgnoreprivate Environment env;public AbstractDataSourceProperties(String factoryBeanName) {this.factoryBeanName = factoryBeanName;}public String getDataType() {return this.dataType;}public void setDataType(String dataType) {this.dataType = dataType;}public RuleType getRuleType() {return this.ruleType;}public void setRuleType(RuleType ruleType) {this.ruleType = ruleType;}public String getConverterClass() {return this.converterClass;}public void setConverterClass(String converterClass) {this.converterClass = converterClass;}public String getFactoryBeanName() {return this.factoryBeanName;}protected Environment getEnv() {return this.env;}public void setEnv(Environment env) {this.env = env;}public void preCheck(String dataSourceName) {}public void postRegister(AbstractDataSource dataSource) {switch(this.getRuleType()) {case FLOW:FlowRuleManager.register2Property(dataSource.getProperty());break;case DEGRADE:DegradeRuleManager.register2Property(dataSource.getProperty());break;case PARAM_FLOW:ParamFlowRuleManager.register2Property(dataSource.getProperty());break;case SYSTEM:SystemRuleManager.register2Property(dataSource.getProperty());break;case AUTHORITY:AuthorityRuleManager.register2Property(dataSource.getProperty());break;case GW_FLOW:GatewayRuleManager.register2Property(dataSource.getProperty());break;case GW_API_GROUP:GatewayApiDefinitionManager.register2Property(dataSource.getProperty());}}
}

具体再向下跟代码吧。。在这不说了。。

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chrome 115 有哪些值得关注的新特性?

今天带大家一起来了解一下 Chrome 115 值得关注的新特性。 滚动动画 用滚动驱动的动画是网站上非常常见的用户体验模式&#xff0c;比如当页面向前或向后滚动时&#xff0c;对应的动画也会向前或向后移动。 比如下面图中这种比较常见的&#xff0c;页面顶部的进度条随着滚动…

华为OD机试真题 Java 实现【数字涂色】【2022Q4 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

Flowable-UI

title: Flowable-UI date: 2023-7-23 12:19:20 tags: - Flowable Flowable-UI 安装 手把手教大家画了这样一个流程图&#xff0c;虽然说它不是特别好用&#xff0c;但是也不是不能用&#xff0c;也能用。好了&#xff0c;那么接下来的话&#xff0c;我们这个就先告一个段落&…

客户方数据库服务器CPU负载高优化案例

客户方数据库服务器CPU负载高优化案例 背景 上周线上服务出现一个问题&#xff0c;打开某个页面&#xff0c;会导致其它接口请求响应超时&#xff0c;排查后发现数据库响应超400s&#xff0c;之前1s就可查到数据。 具体原因是有个大屏统计页面&#xff0c;会实时查看各业务服…

Java面试:技巧与实践

Java面试&#xff1a;技巧与实践 在当今的IT行业中&#xff0c;Java已经成为了一种非常流行的编程语言。它以其跨平台、面向对象、安全性高等特点&#xff0c;吸引了无数的开发人员。然而&#xff0c;掌握Java并不是一件容易的事情&#xff0c;尤其是在面试过程中。本文将为您…

Netty学习(三)

文章目录 三. Netty 进阶1. 粘包与半包1.1 粘包现象服务端代码客户端代码 1.2 半包现象服务端代码客户端代码 1.3 现象分析粘包半包缘由滑动窗口MSS 限制Nagle 算法 1.4 解决方案方法1&#xff0c;短链接方法2&#xff0c;固定长度方法3&#xff0c;固定分隔符方法4&#xff0c…

QT之QMediaPlayer使用播放音频

简介 使用QMediaPlayer播放MP3格式音乐。 播放相关状态流程简述 操作&#xff1a;m_pMediaPlayer->setMedia(); &#xff08;初始化加载&#xff0c;为play()&#xff09; 状态&#xff1a; __onMediaChanged QUrl(“qrc:/sounds/Sounds/Big.mp3”) __onMediaStatusChang…

【javaSE】初识Java

目录 Java是什么 Java语言发展简史 初识Java的main方法 运行Java程序 JDK、JRE、JVM之间的关系 Java中的标识符 Java是什么 Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义. 不仅如此&#xff0c;Java还是一个有一系列计算机软件和规…

CHI中一致性状态简介

Coherence Protocol 各个状态描述&#xff08;只描述有意思的&#xff09;&#xff1b;I Invalid: UC Unique Clean: □ 当前cacheline可以直接修改&#xff0c;不用通知其他RN或HN; □ HNF来snoop时&#xff0c;数据可以返回给HNF, 也可以不返回&#xff1b; □ HNF来snoop…

clickhouse数据库里聚合函数any的用法

文章目录 需求场景any相关函数any函数anyHeavy函数介绍anyLast函数 生产使用 需求场景 进行分组聚合统计时&#xff0c;有几个字段也需要返回&#xff0c;但是不在聚合的需求里面。对于同一聚合条件的记录&#xff0c;这些字段的值&#xff0c;有可能会不同&#xff0c;但是这…

华为OD机考--食堂供餐--带答案

题目描述&#xff1a; 某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0&#xff0c;食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息&#xff0c;计算出一个刚好能达成排队时间为0的最低供餐速度。即&#xff0c;食堂在每个单位时间内必须至少做出…

Psim 2022仿真软件的安装--Psim电力仿真实战教程

文章目录 Psim 2022 仿真软件安装及使用教程软件介绍1.下载psim 2022安装软件&#xff0c;有需要的亲请联系作者。2.点击安装文件3.点击进行安装&#xff1a;4.安装完成&#xff0c;打开软件&#xff0c;开始仿真5.仿真模型介绍5.1.单相全控整流电路仿真5.2 三相PFC可控整流电路…

红黑树深入剖析【C++】

目录 一、红黑树概念 二、红黑树节点结构设计 三、插入操作 处理情况1 处理情况2 处理情况3 插入总结&#xff1a; 四、插入操作源码 五、红黑树验证 一、红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0…

Selenium+Java环境搭建(测试系列6)

目录 前言&#xff1a; 1.浏览器 1.1下载Chrome浏览器 1.2查看Chrome浏览器版本 1.3下载Chrome浏览器的驱动 2.配置系统环境变量path 3.验证是否成功 4.出现的问题 结束语&#xff1a; 前言&#xff1a; 这节中小编给大家讲解一下有关于Selenium Java环境的搭建&…

Docker 的数据管理 与 Dockerfile

目录 Docker 的数据管理容器互联&#xff08;使用centos镜像&#xff09;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建镜像加载原理 Dockerfile 操作常用的指令&#xff08;1&#xff09;FROM 镜像&#xff…

docker—springboot服务通信

文章目录 docker—springboot服务通信一、方式1、host 二、坑点末、参考资料 docker—springboot服务通信 一、方式 1、host 步骤&#xff1a; host文件增加域名解析&#xff1a; 127.0.0.1 rabbitmqapplication.yml&#xff1a; application.yml中&#xff0c;连接方式使用…

[STL]list使用介绍

[STL]list使用 注&#xff1a;本文测试环境是visual studio2019。 文章目录 [STL]list使用1. list介绍2. 构造函数3. 迭代器相关函数begin函数和end函数rbegin函数和rend函数 4. 容量相关函数empty函数size函数 5. 数据修改函数push_back函数和pop_back函数push_front函数和pop…

Python MySQL

pymysql 除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库。 在Python中&#xff0c;使用第三方库&#xff1a;pymysql 来完成对MySQL数据库的操作。 安装&#xff1a; pip install pymysql 或在pycharm中搜索pymysql插件安装 创建到MySQ…

在CSDN学Golang云原生(Docker容器)

一&#xff0c;Doker 命令行操作 在Go语言中&#xff0c;可以通过调用Docker命令行工具来进行容器管理和操作。下面是一些基本的Docker命令行操作示例&#xff1a; 启动一个新容器 cmd : exec.Command("docker", "run", "-d", "nginx&qu…

C++(14):重载运算与类型转换

当运算符被用于类类型的对象时&#xff0c;允许我们为其指定新的含义&#xff1b;同时&#xff0c;也能自定义类类型之间的转换规则。和内置类型的转换一样&#xff0c;类类型转换隐式地将一种类型的对象转换成另一种我们所需类型的对象。 当运算符作用于类类型的运算对象时&a…