热点规则
该规则其实就是针对方法参数的限流,把后端接口修改为:
@RequestMapping("/byUrl")
@SentinelResource(value = "byUrl")
public String getUser(String p1, String p2) {
return "javaCoder";
}
新增这样一条热点规则:
在浏览器中快速刷新访问:
访问localhost:8401/user/byUrl?p1=8也是同样的效果,但是访问localhost:8401/user/byUrl?p2=10,该热点规则就是无效的,因为请求路径中没有p1参数。还有一个注意点是,资源名要设置成@SentinelResource的value值,设置成方法的请求路径:/user/byUrl,热点规则也会无效。
也可以更精密地控制:当参数为某个值时,有其对应的阈值(参数类型只能为基本类型和String):
像这里,当访问路径为:localhost:8401/user/byUrl?p1=8,这时QPS要达到10才会进行限流;p1不为8时,QPS还是只要1就会限流。
整合Feign
把当前该模块作为服务请求方,pom.xml中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
bootstrap.yml中添加:
feign:
sentinel:
enabled: true
启动类添加@EnableFeignClients、创建@FeignClient修饰的接口,和之前讲解OpenFeign时一样。有一个不同点是配置超时的地方,之前需要在配置文件里面配一堆超时时间,现在只需要在@FeignClient中配置:
import feign.Request;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(value = "user-service",
configuration = {UserFeignClient.ProviderFeignClientConfigure.class})
public interface UserFeignClient {
@RequestMapping("/user/sayHello")
String sayHello();
class ProviderFeignClientConfigure{
@Bean
Request.Options options(){
//配置超时时间,1600ms是请求处理的超时时间,
//3000ms是请求连接的超时时间
return new Request.Options(3000, 1600);
}
}
}
就是由@FeignClient的configuration属性,指向的类来控制了。请求服务方和之前一模一样的搭建。
持久化
nacos可以作为配置中心,Sentinel的持久化就是把各种规则保存到nacos的配置列表中。引入Sentinel的模块,在bootstrap.yml添加:
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
# 配置nacos地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: public
group-id: DEFAULT_GROUP
# 详见com.alibaba.csp.sentinel.slots.block.flow.FlowRule
data-id: sentinel-flow
data-type: json
# com.alibaba.cloud.sentinel.datasource.RuleType,流控规则
rule-type: flow
然后在nacos的配置列表中,添加名为sentinel-flow的配置:
具体的json数据:
[
{
"resource": "/user/byUrl",
"limitApp": "default",
"//": "阈值类型",
"grade": 1,
"?count": "单机阈值",
"count": 1,
"?clusterMode": "是否集群",
"clusterMode": false,
"?strategy": "流控模式",
"strategy": 0,
"controlBehavior": 0,
"warmUpPeriodSec": 4,
"maxQueueingTimeMs": 200
}
]
项目重启后,流控规则会多出来一条数据(这是流控规则的持久化);如果还想另外加规则,bootstrap.yml中,spring.cloud.sentinel.datasource下继续添加ds2(还可以继续加ds3、ds4、ds5…),下面的子元素和ds1一样,只是有2个子元素的值要变,data-id和rule-type:data-id是你要在nacos中新建的配置名称,rule-type的值还可以是degrade(熔断规则)、param-flow(热点规则)、system(系统规则)。nacos中新建配置的key,也是各不相同,见com.alibaba.cloud.sentinel.datasource.RuleType: