@RequestMapping("/reduct2")
public String reduct2(){
int a = 1/0;
System.out.println("扣减库存");
return "扣减库存:"+port;
}
在order-openfeign-sentinel当中编写对应的调用微服务的业务逻辑
@FeignClient(name = "stock-service",path = "/stock",configuration = FeignConfig.class)
public interface StockFeignService {
@RequestMapping("/reduct2")
public String reduct2();
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private StockFeignService stockFeignService;
@RequestMapping("/add")
public String add(){
return stockFeignService.reduct2();
}
}
完善一下配置文件
运行项目
访问:http://localhost:8041/order/add
引入Sentinel依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
@Component
public class StockFeignServiceFallback implements StockFeignService{
@Override
public String reduct2() {
return "降级啦!!";
}
}
/*
*
* 2、添加feign接口和方法
* name 指定调用rest接口所对应的服务名
* path 指定调用的rest接口所在的StockController指定的@RequestMapping
* */
@FeignClient(name = "stock-service",path = "/stock",fallback = StockFeignServiceFallback.class)
public interface StockFeignService {
@RequestMapping("/reduct2")
public String reduct2();
}
feign:
sentinel:
# openfeign 整合sentinel
enabled: true
访问:http://localhost:8041/order/add
何为热点?热点即经常访问的数据。
很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制。
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。
热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
注意:
1.热点规则需要使用@SentinelResource("resourceName")
注解,否则不生效
2.参数必须是7种基本数据类型才会生效
测试用例
@RequestMapping("/get/{id}")
@SentinelResource(value = "getById",blockHandler = "HotBlockHandler")
public String getById(@PathVariable("id") Integer id){
System.out.println("正常访问");
return "正常访问";
}
public String HotBlockHandler(@PathVariable("id") Integer id, BlockException e){
return "热点异常处理";
}
}
对上述id参数进行流控
访问:http://localhost:8041/order/get/1
不断访问:http://localhost:8041/order/get/1
我们访问id为2 的
不断访问:http://localhost:8041/order/get/2
无论怎样访问依旧是正常
Sentinel系统自适应限流从整体维度对应用入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入
口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
CPU cores * 2.5
。2.0x
访问:http://localhost:8041/order/get/1
不断访问
如果不做任何修改,Dashboard的推送规则方式是通过API将规则推送至客户端并直接更新到内存中:
这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。
pll模式的数据源(如本地文件、RDBMS等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager,将写数据源注册至tansport的WritableDataSourceRegistry
中。
生产环境下一般更常用的是push模式的数据源。
对于push模式的数据源,如远程配置中心(Zookeeper Nocos,Apole等等),推送的操作不应由Sentinel客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。
因此推送规则正确做法应该是配置中心控制台/Sentiel控制台→配置中心→ Sentinel数据源→Sentinel
,
而不是经Sentinel数据源推送至配置中心。这样的流程就非常清晰了︰
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
nacos配置中心中配置流控规则
http://192.168.180.128:8849/nacos/#/configurationManagement?dataId=&group=&appName=&namespace=&pageSize=&pageNo=
[
{
"resource": "/order/flow",
"controlBehavior": 0,
"count": 10.0,
"grade": 1,
"limitApp": "default",
"startegy": 0
}
]
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
dependencies>
server:
port: 8861
spring:
application:
name: order-sentinel
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8858
web-context-unify: false #默认将调用链路收敛
datasource:
flow-rule:
nacos:
server-addr: 192.168.180.128:8849
username: nacos
password: nacos
dataId: order-sentinel-flow-rule
rule-type: flow
访问:http://127.0.0.1:8861/order/flow
不断连续点击访问
我们可以看到
http://127.0.0.1:8858/#/dashboard/flow/order-sentinel