网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 |
---|
如果右边没有就找找左边 |
- 分布式防御系统。以流量为切入点,通过动态设置的流量控制、服务熔断等手段达到保护系统的目的,通过服务降级增强服务被拒后用户的体验
- 阿里巴巴的开源项目,提供了系统负载保护等多个维度来保障服务之间的稳定性。
- 2012年,Sentinel诞生,主要功能为入口流量控制
- 2013~2017年,Sentinel在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel也因此积累了大量的流量归整场景以及生产实践。
- 2018年,Sentinel开源,并持续演进
- 2019年,Sentinel朝着多语言扩展的方向不断探索,推出C++原生版本,同时针对Service Mesh场景也推出了Envoy集群流量控制支持,以解决Service Mesh架构下多语言限流的问题。
- 2020年,推出Sentinel Go版本,继续朝着云原生方向演进。
- 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
- 完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、GRPC的整合。您只需要引入相应的依赖并进行简单配置即可快速地接入Sentinel。
- 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速的定制逻辑。例如定制规则管理、适配动态数据源等。
- 核心库(java 客户端)不依赖任何框架和第三方库,能够运行于所有java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持
- 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器
- 资源:是关键概念,可以是java应用程序中的任何内容,例如,有应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。后面我们用资源来描述代码块,只要通过Sentinel API定义的代码,就是资源,能够被Sentinel保护起来,大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源
- 规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
- 流量控制:在网络传输中的一个常用概念,用于调整网络包的发送数据,然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状
- 设计理念(让您自由选择控制角度,并灵活组合,从而达到想要的效果),有以下几个角度
- 资源的调用关系,例如资源的调用链路,资源和资源之间的关系
- 运行指标,例如QPS、线程池、系统负载等
- 控制的效果,例如直接限流、冷启动、排队等。
- 熔断降级:除了流量控制外,及时对调用链路中的不稳定因素进行熔断也是Sentinel的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。
- 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障(和Hystrix原则一致)
- 限制手段上,和Hystrix采取完全不一样的方法
- Hystrix通过线程池隔离的方式,来对依赖(Sentinel中的资源)进行隔离,好处是资源和资源之间做到最彻底的隔离,缺点是增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各资源做线程池大小的分配。
- Sentinel对这个问题采取了两种手段
- 通过并发线程数进行限制:和资源池隔离不同,Sentinel通过限制并发线程数量,减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池大小。那么当某资源不稳定,线程数逐步堆积到一定数量后,新的请求就会被拒,堆积线程完成任务后,才开始继续接收请求
- 通过响应时间对资源进行降级:通过响应时间来快速降级不稳定资源。当依赖的资源出现响应时间过长后,所有对改资源的访问都会被直接拒绝,直到过了指定的时间窗口后才重新恢复。
- 系统自适应保护:Sentinel同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高时,如果还持续让请求进入,可能会导致系统崩溃,无法响应。集群环境下,网络负载均衡会把本应当前机器承载的流量转发到其它机器上,如果这个时候其它机器也处于濒临崩溃的状态,此时Sentinel的对应保护机制将会发挥作用。让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之外处理最多的请求
- 对主流框架提供适配或者显示API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析
- 根据预设的规则,结合对资源的实时统计信息,对流量进行控制,同时,Sentinel提供开放的接口,方便您定义及改变规则
- Sentinel提供实时的监控系统,方便快速了解目前系统的状态
一、快速入门案例
1. 创建父工程,引入依赖(设置父工程< packaging >pom</ packaging>) |
---|
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<springboot.version>2.3.2.RELEASE</springboot.version>
<springcloudalibaba.version>2.2.4.RELEASE</springcloudalibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${springcloudalibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2. 创建子模块sentinel-test 引入依赖,做相关配置 |
---|
- 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
</dependencies>
- 配置文件
server:
port: 80
servlet:
context-path: "/"
- 启动类
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
@RestController
public class SentinelController {
@PostConstruct
public void initFlowRules(){
ArrayList<FlowRule> flowRules = new ArrayList<>();
FlowRule flowRule = new FlowRule();
flowRule.setResource("HelloWorld");
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRule.setCount(2);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);
}
@RequestMapping("helloWorld")
public String helloWorld(){
try(Entry entry = SphU.entry("HelloWorld")){
return "Sentinel "+System.currentTimeMillis();
}catch (Exception e){
e.printStackTrace();
return "系统繁忙,请稍后!";
}
}
}
二、Sentinel dashboard控制台
- 流量控制、熔断降级规则统一配置和管理入口,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。在Sentinel控制台上,我们可以配置规则并实时查看流量控制效果。
1. 控制台
通过cmd运行jar包启动,然后访问web页面,用户名密码都是sentinel |
---|
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
2. java接入控制台
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.0</version>
</dependency>
-Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-helloWorld
3. 设置限流规则
- 之前我们设置规则,是通过代码设置,不方便修改和维护,推荐使用Sentinel控制台设置规则
4. 定义资源(推荐使用注解方式,掌握抛异常,布尔值,其它了解一下即可)
- 资源可以是任何东西,服务、服务里面的方法,甚至一段代码,使用Sentinel来进行资源保护,主要步骤如下:
- 定义资源
- 定义规则
- 检验规则是否生效
- 先把可能需要保护的资源定义好(埋点),之后再配置规则,也可以理解为,只要有了资源,我们就可以在随时灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。对于主流框架,我们提供适配,只需要按照适配中的说明配置,Sentinel就会默认定义提供的服务,方法等资源。
- 为了减少开发复杂度,大部分主流框架(Web Servlet,Dubbo,Spring Cloud,gRPC、Spring WebFlux、Reactor等)都做了适配,只需要引入对应的依赖即可方便的整合Sentinel。
方法二:抛异常的方式定义资源(就是入门案例中使用的) |
---|
- SphU包含了try-catch风格的API。这种方式,当资源发生了限流之后会抛出BlockException。这时可以捕捉遗产,进行限流之后的逻辑处理,具体参考快速入门案例中的controller
- 通过SphU.entry(“资源名”)方法,定义资源。若entry的时候传入热点参数,那么exit的时候也移动要带上对应参数(exit(count,args)),否则会统计错误。
- 可通过Tracer.trace(ex) 来统计异常信息
- SphO提供if-else风格API,用这种方法,当资源发送限流后,返回false,这时根据返回值,进行限流后逻辑处理
- 小例子
@RequestMapping("helloWorld2")
public String helloWorld2(){
if(SphO.entry("HelloWorld")){
try{
return "boolean "+System.currentTimeMillis();
}finally {
SphO.exit();
}
}else{
return "系统繁忙,请稍后!";
}
}
- 通过@SentinelResource注解定义资源并配置blockHandler和fallback函数来进行限流之后的处理
- 需要额外依赖,提供注解以及AspectJ的扩展用于自动定义资源,处理BlockException等
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.0</version>
</dependency>
- 配置类
import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect(){
return new SentinelResourceAspect();
}
}
- 使用注解看效果
@SentinelResource(value = "HelloWorld",blockHandler = "blockHandlerForHelloWorld3")
@RequestMapping("helloWorld3")
public String helloWorld3(){
return "SentinelResource" + System.currentTimeMillis();
}
public String blockHandlerForHelloWorld3(BlockException e){
e.printStackTrace();
return "系统繁忙,请稍后!";
}
- Sentinel支持异步调用链路统计。在异步调用中,需要通过SphU.asyncEntry(xxx)方法定义资源,并通常需要在异步的回调函数中调用exit方法。
- 启动类添加注解@EnableAsync,让项目支持异步调用支持
- 创建AsyncService异步调用类以及方法
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
@Async
public void doSomethingAsync(){
System.out.println("async start...");
try{
Thread.sleep(4000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("async end...");
}
}
- controller测试
@Autowired
private AsyncService asyncService;
@RequestMapping("helloWorld4")
public void helloWorld4(){
AsyncEntry asyncEntry = null;
try {
asyncEntry = SphU.asyncEntry("HelloWorld");
asyncService.doSomethingAsync();
}catch (BlockException e){
System.out.println("系统繁忙,请稍后!");
}finally {
if(asyncEntry!=null){
asyncEntry.exit();
}
}
}
5. 规则(了解一下即可,掌握web管理器的使用)
- Sentinel的所有规则,都可以在内存中动态的查询及修改,修改后立即生效。同时Sentinel也提供相关API,来定制自己的规则策略
1. 流量控制规则
- 原理就是监控应用流量的QPS或并发线程等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
- 重要属性如下(Field字段,代表代码设置时的方法名):
Field | 说明 | 默认值 |
---|
resource | 资源名,限流规则的作用对象 | | count | 限流阈值 | | grade | 限流阈值类型,QPS模式(1)或并发线程数模式(0) | QPS模式 | limitApp | 流控针对的调用来源 | default,代表不区分调度来源 | strategy | 调用关系限流策略:直接、链路、关联 | 根据资源本身(直接) | controlBehavior | 流控效果(直接拒绝/WarmUp/均速+排队等待),不支持按调用关系限流 | 直接拒绝 | clusterMode | 是否集群限流 | 否 |
- QPS:每秒请求数限制
- 线程数:资源使用线程数限制
- 直接:资源直接限流,这个就是简单的限流
- 关联:关联模式需要填写关联资源的路径,意为如果关联资源的流量超额之后,限流自己(自己为资源名填写的路径)
- 链路:如果是链路模式需要填写入口资源,限制入口资源对自己的调用
流控效果(同一个资源可以同时有多个限流规则,检查规则时会依次检查) |
---|
- 快速失败:默认的流控方式,当QPS超过任意规则阈值后,新请求会立即被拒绝,抛出FlowException。此方式适用于对系统处理能力确切已知的情况线下,比如通过压测确定了系统的准确水位时
- Warm Up:预热/冷启动方式。当系统长期处于低水位情况下,流量突然增加,直接把系统拉升到高水可能瞬间把系统压垮。通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮
- 排队等待:严格控制请求通过的间隔时间,也让请求以均匀的速度通过,对应的是漏桶算法
2. 熔断降级规则
- 对不稳定资源进行熔断降级是保障高可用的重要措施之一,一个服务常常会调用别的模块,可能是远程服务、数据库、第三方API等,例如支付时远程调用支付宝,银联API。然而被依赖服务的稳定性是不能保证的,如果依赖的服务出现不稳定,请求响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用
- 现代微服务架构都是分布式的,不同服务之间相互调用,组成复杂的调用链路,复杂链路某一环不稳定,就可能会层层级联,最终导致整个链路都不可用,因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
Field | 说明 | 默认值 |
---|
resource | 资源名,规则的作用对象 | | grade | 熔断策略,支持慢调用比例/异常比率/异常数策略 | 慢调用比例 | count | 慢调用比例模式下为慢调用临界RT(超出该值记为慢调用);异常比例/异常数模式下为对应的阈值 | QPS模式 | timeWindow | 熔断时长,单位s | | minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断 | 5 | statIntervalMs | 统计时长(单位ms),如60*1000代表分钟级 | 1000ms | slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效 | |
List<DegradeRule> rules = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("HelloWorld");
degradeRule.setCount(10);
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
degradeRule.setTimeWindow(10);
rules.add(degradeRule);
DegradeRuleManager.loadRules(rules);
- 慢调用比例(SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用,单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN),若接下来的一个请求响应时间小于设置的慢调用RT则结束熔断,若大于设置的慢调用RT则会再次被熔断
- 异常比例(ERROR_RATIO):当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0,1.0]代表0%~100%
- 异常数(ERROR_COUNT):当单位统计时长内的异常数目超过阈值后会自动进行熔断,经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断
- 注意:异常降级仅仅针对业务异常,对Sentinel限流降级本身的异常(BlockException)不生效。为了统计异常比率或异常数,需要通过Tracer.trace(ex)记录业务异常,示例如下(开源整合模块,Sentinel Dubbo Adapter,Sentinel Web Servlet Filter或@SentinelResource注解会自动统计业务异常,需要手动调用)
3. 系统保护规则
- Sentinel系统自适应限流从整体维度对应入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性
- 保证系统不被拖垮
- 在系统稳定的前提下,保持系统的吞吐量
Field | 说明 | 默认值 |
---|
highestSystemLoad | load1触发值,用于触发自适应控制阶段 | -1(不生效) | avgRt | 所有入口流量的平均响应时间 | -1(不生效) | maxThread | 入口流量的最大并发数 | -1(不生效) | qps | 所有入口资源的QPS | -1(不生效) | highestCpuUsage | 当前系统的CPU使用率(0.0~1.0) | -1(不生效) |
- 代码设置
ArrayList<SystemRule> rules = new ArrayList<>();
SystemRule systemRule = new SystemRule();
systemRule.setHighestSystemLoad(10);
rules.add(systemRule);
SystemRuleManager.loadRules(rules);
4. 来源访问控制规则
- 很多时候,我们需要根据调用来源来判断该次请求是否允许,这时候可以使用此功能。此功能提供黑白名单,配置白名单则只有请求来源位于白名单内时才可通过,若配置黑名单,则请求来源不在黑名单中,才能通过
- 调用放信息通过ContextUtil.enter(resourceName,origin)方法中的origin参数传入
- resource:资源名,限流规则作用的对象
- limitApp:对应的黑名单/白名单,不同origin用逗号分隔,如appA,appB.
- strategy:限制模式,AUTHORITY_WHITE为白名单模式,AUTHORITY_BLACK为黑名单模式,默认白名单模式
示例:希望控制对资源test的访问设置白名单,只有来源为appA和appB的请求才可通过 |
---|
AuthorityRule authorityRule = new AuthorityRule();
authorityRule.setResource("test");
authorityRule.setStrategy(RuleConstant.AUTHORITY_WHITE);
authorityRule.setLimitApp("appA,appB");
AuthorityRuleManager.loadRules(Collections.singletonList(authorityRule));
5. 热点参数规则
- 热点:经常访问的数据
- 很多时候,我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制
- 商品ID为参数,统计一段时间内最常购买的商品ID并进行限制
- 用户ID为参数,针对一段时间内频繁访问的用户ID进行限制
- 热点参数限流会统计传入参数的热点参数,并根据配置的限流阈值与模式,对包含特点参数的资源调用进行限流,热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。(Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控,热点参数限流支持集群模式)
ParamFlowRule param1 = new ParamFlowRule("param1");
param1.setParamIdx(0)
.setCount(5);
ParamFlowItem paramFlowItem = new ParamFlowItem().setObject(String.valueOf(param1));
paramFlowItem.setClassType(int.class.getName())
.setCount(10);
param1.setParamFlowItemList(Collections.singletonList(paramFlowItem));
ParamFlowRuleManager.loadRules(Collections.singletonList(param1));
- 加入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.8.0</version>
</dependency>
- 编写controller
@RequestMapping("helloWorld")
public String helloWorld(){
Entry entry = null;
try{
entry = SphU.entry("HelloWorld", EntryType.IN,1, param1);
System.out.println(param1);
return "Sentinel "+System.currentTimeMillis();
}catch (Exception e){
e.printStackTrace();
return "系统繁忙,请稍后!";
}finally {
entry.exit(0,EntryType.IN,1,param1);
}
}
三、Spring Cloud整合Sentinel(重点)
1. 和Spring Cloud集成
- Spring Cloud Alibaba默认为Sentinel整合了Servlet、RestTemplate、FeignClient和Spring WebFlux,它不仅补全了Hystrix在Servlet和RestTemplate这一块的空白,还完全兼容了Hystrix在FeignClient中限流降级的用法,并支持灵活配置和调整流控规则
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
server:
port: 80
servlet:
context-path: "/"
spring:
application:
name: sentinel_springcloud
cloud:
sentinel:
transport:
dashboard: localhost:8080
@RestController
public class SentinelController {
@SentinelResource(value = "HelloWorld",blockHandler = "blockHandlerForHelloWorld3")
@RequestMapping("helloWorld3")
public String helloWorld3(){
return "SentinelResource" + System.currentTimeMillis();
}
public String blockHandlerForHelloWorld3(BlockException e){
e.printStackTrace();
return "系统繁忙,请稍后!";
}
}
2. 整合nacos实现配置持久化
- 前面的例子中,每次重启,客户端中数据将会消失,需要重新定义规则,因为默认是将规则放在内存
- 我们可以将规则保存到Nacos配置中心中,实现持久化
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
类型选择为json
[
{
"resource":"HelloWorld",
"limitApp":"default",
"grade":1,
"count":2,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
3. 配置文件中配置spring cloud和nacos中获取规则 |
---|
server:
port: 80
servlet:
context-path: "/"
spring:
application:
name: sentinel_springcloud
cloud:
sentinel:
transport:
dashboard: localhost:8080
datasource:
ds:
nacos:
server-addr: localhost:8848
group-id: DEFAULT_GROUP
rule-type: flow
data-id: sentinel-test
data-type: json
四、源码
|