1. 概述
本篇文章主要记录自己在学习nacos和sentinel中需要注意的一些点,在学习过程中会不断更新,暂时先写几个注意点。基于的版本:
JDK:17
spring-boot:3.0.9
mybatis-plus:3.5.3.2
jackson-core:2.14.3
spring-cloud-alibaba-dependencies:2022.0.0.0
spring-cloud-starter-bootstrap:3.1.5
:用来解决springboot
不识别bootstrap.yaml
的问题。
主要学习参考的学习网址:
- nacos官方文档
- sentinel官方文档
- sentinel的github
强烈建议自行查看官方文档学习,写得很详细,很全面,本博客只是问题记录,是抛砖引玉的存在。
2. nacos
2.1 nacos鉴权的注意点
2.1.1 开启鉴权的配置
- 进入到nacos的安装目录的配置文件文件夹
nacos\conf
。 - 编辑
application.properties
。 - 修改以下配置,
注意:原本配置文件中是存在这些属性设置的,只是设置的值全部是空,直接补上就行,这是个坑,我一直开始找了半天发现不了问题,原来是已经存在了。
nacos.core.auth.enabled=true
### 2.1.0 版本后
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
### 配置自定义身份识别的key(不可为空)和value(不可为空)
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
这里贴一下鉴权的其他属性:
2.1.2 持久化nacos配置到mysql数据库
- 进入到nacos的安装目录的配置文件文件夹
nacos\conf
。 - 找到
mysql-schema.sql
。 - 在自己的数据库中新建这些表,并修改
application.properties
中的配置,如下所示:
# spring.datasource.platform=mysql ---已废弃
spring.sql.init.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/xxxxx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
### hikariCP配置
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
nacos.config.push.maxRetryTime=50
注意:更改数据源后,鉴权中设置的用户名密码将失效,将会采用users表中的用户名和密码
3. sentinel
3.1 sentinel持久化设置到nacos的注意点
依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>x.y.z</version>
</dependency>
yaml
的配置新增nacos数据源配置
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8088
datasource:
ds:
nacos:
server-addr: localhost:8848
username: nacos
password: nacos
namespace: mybatis-plus-study
group-id: dev
data-id: springcloudalibaba-sentinel-nacos
rule-type: flow --本示例采取流控规则,还有其它的规则类型,可参考官网
- 新增
SentinelWriteRead
类,帮助sentinel在初始化时,从nacos中拉取配置。
@Component
public class SentinelWriteRead {
@PostConstruct
public void init() throws NacosException {
System.out.println("-------------init-----------");
String dataId = "springcloudalibaba-sentinel-nacos";
String group = "dev";
//TODO 从Nacos配置中心读取限流规则
// 创建 NacosDataSource 并将其注册至对应的 RuleManager 上
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "localhost");
properties.put(PropertyKeyConst.NAMESPACE, "mybatis-plus-study"); // 指定namespace配置
properties.put(PropertyKeyConst.USERNAME, "nacos"); // 指定用户名
properties.put(PropertyKeyConst.PASSWORD, "nacos"); // 指定密码
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(properties, group, dataId,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
System.out.println(flowRuleDataSource.getProperty());
//TODO 发布限流规则方式一:手动通过API修改
// final String rule = "[\n"
// + " {\n"
// + " \"resource\": \"login\",\n"
// + " \"controlBehavior\": 0,\n"
// + " \"count\": 5.0,\n"
// + " \"grade\": 1,\n"
// + " \"limitApp\": \"default\",\n"
// + " \"strategy\": 0\n"
// + " }\n"
// + "]";
// ConfigService configService = NacosFactory.createConfigService(serverAddr);
// boolean isPublishOk = configService.publishConfig(dataId, group, rule);
// System.out.println(isPublishOk);
//TODO 发布限流规则方式二:自动写入
//TODO Sentinel Dashboard中修改规则同步到Nacos
WritableDataSource writableDataSource = new WriteableNacos<>();
WritableDataSourceRegistry.registerFlowDataSource(writableDataSource);
}
}
- 新增
WriteableNacos
类,在更新sentinel时将配置持久化到nacos
public class WriteableNacos<T> implements WritableDataSource<T> {
//当sentinel update 时候
@Override
public void write(T value) throws Exception {
String s = JSON.toJSONString(value);
System.out.println("-------------write-----------" + s);
String dataId = "springcloudalibaba-sentinel-nacos";
String group = "dev";
// 发布配置
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "localhost");
properties.put(PropertyKeyConst.NAMESPACE, "mybatis-plus-study"); // 指定namespace配置
properties.put(PropertyKeyConst.USERNAME, "nacos"); // 指定用户名
properties.put(PropertyKeyConst.PASSWORD, "nacos"); // 指定密码
ConfigService configService = NacosFactory.createConfigService(properties);
boolean isPublishOk = configService.publishConfig(dataId, group, s);
System.out.println("isPublishOk========" + isPublishOk);
}
@Override
public void close() throws Exception {
}
}
- 在nacos中新增命名空间
mybatis-plus-study
,在该命名空间下新增dev
组的springcloudalibaba-sentinel-nacos
配置文件,类型为json。
最近有点忙,先暂停更新吧…