天天看点

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

前言

上一节我们讲了Sentinel的简介和与Hystrix的对比,本节我们讲解Sentinel的具体使用。

前期准备

  1. 加入pom依赖
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
           
  1. 修改Nacos的yml配置
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
sentinel:
      transport:
        dashboard: localhost:8081
        port: 8719
           
  1. 启动Sentinel
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
@echo off
 
java -Dserver.port=8081  -Dsentinel.dashboard.auth.username=Bifang -Dsentinel.dashboard.auth.password=Bifang -jar sentinel-dashboard-1.7.2.jar

@echo on
           
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

4. 启动pay服务

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

实现流控规则

刚才访问了http://127.0.0.1:9003/OrderPay后,sentinel面板中就出现了服务。
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

添加流控规则

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

各项功能参数讲解

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

添加测试

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

测试

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

可以发现当点击速度过快后就能发现返回了默认值,禁止了访问。

其他的功能可根据功能讲解图的提示,来体验一下效果

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

实现降级规则

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

各参数讲解图

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

RT规则编码测试

  1. 给接口加上等待时间,模拟业务处理时间
@GetMapping("/testD") 
public String testD()    { 
 { 
	 try { 
	 	TimeUnit.SECONDS.sleep(1);
	 	 } 
 	catch (InterruptedException e) {
 		 e.printStackTrace(); 
 		 }
 	 log.info("testD 测试RT"); return "------testD";    } ;    
  } 
           
  1. 设置降级规则
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
  2. jmeter工具测试
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
    其他的规则请自行测试

热点规则

根据接口传递的参数限流。

  1. 代码
@GetMapping("/testHotKey") 
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey") public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2)
    { 
    	return "------testHotKey";
    	} 
//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){ return "deal_testHotKey";  
} 

           
  1. 配置规则
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
    Spring Cloud微服务脚手架搭建实战——Sentinel使用实战
    访问接口测试效果。

系统规则

系统规则只是将限流规则提升到了整个服务层面,配置基本没变,只是对整个系统请求起作用,如QPS限制设置为1,则所有接口超过限制都无法访问。

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

授权规则

设置调用方调用服务的白名单和黑名单,白名单调用发可不被流控规则限制。

Spring Cloud微服务脚手架搭建实战——Sentinel使用实战

集群流控

为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台)。这时候我们很自然地就想到,找一个 server 来专门来统计总的调用量,其它的实例都与这台 server 通信来判断是否可以调用。这就是最基础的集群流控的方式。

另外集群流控还可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为 10 QPS,理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。

集群流控中共有两种身份:

Token Client:集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流。

Token Server:即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。