SpringCloudAlibaba之Sentinel(二)
热点规则
该规则其实就是针对方法参数的限流,把后端接口修改为:
@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中添加依赖:
org.springframework.cloud spring-cloud-starter-openfeign 2.2.6.RELEASE
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: