SpringCloudAlibaba之Sentinel(二)

作者: adm 分类: java 发布时间: 2024-02-01

热点规则
  该规则其实就是针对方法参数的限流,把后端接口修改为:

    @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:


如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!