Sentienl-SpringCloudAlibaba03


一、Sentienl

1. 什么是Sentienl?

Sentinel 是一个开源的分布式系统的流量防卫兵,由阿里巴巴集团开发。它旨在为微服务架构提供流量控制、熔断降级、系统负载保护等功能。Sentinel 可以实时监控应用程序的流量情况,并根据预设的规则对流量进行控制和保护,以确保系统的稳定性和可靠性。

2. Sentinel限流实战

第一步:
Sentinel 提供了现成的服务端供我们使用,点击官网下载,下载之后通过命令行启动:

java -jar -Dserver.port=1111 sentinel-dashboard-1.6.0.jar

访问:http://127.0.0.1:1111 进入控制台,使用 sentinel/sentinel登录。
在这里插入图片描述
第二步:修改用户服务 springcloudalibaba-user-server ,加入sentinel依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

第三步:配置Sentinel,在云端或者bootstrap.yml配置,注意结构分层:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:1111

第四步:Sentinel为我们提供了 @SentinelResource 注解标记需要限流的资源,修改UserController:

    @GetMapping("/user/{id}")
    //限流降级
    @SentinelResource(value="user",blockHandler="exceptionHandler")
    public User getById(@PathVariable Long id){
        return new User(id,"我是zs");
    }
    // 限流与阻塞处理 : 参数要和 被降级的方法参数一样
    public User exceptionHandler(@PathVariable Long id, BlockException ex) {
        ex.printStackTrace();
        return new User(-1L,"限流了");
    }

这里通过@SentinelResource的value属性为资源取名为 “user” ,后续我们可以根据该资源名来进行限流。

第五步:Sentinel设置限流策略
启动应用 springcloudalibaba-user-server,然后通过浏览器访问 http://localhost:10020/user/1 ,然后登录Sentinel控制台,在“实时监控”列表中可以看到资源的相关监控信息的:
在这里插入图片描述
在 “族点链路” 列表中可以看到资源的调用链 ,并且可以通过“流控”按钮设置流控规则:
在这里插入图片描述
也可以在“流量控制”菜单中我们可以针对资源进行限流规则的设置。如下:
在这里插入图片描述

这里我添加了一个流控规则,资源名对应客户端 @SentinelResource(value="user".. 注解的资源,通过QPS限流(每秒请求数量),阈值是 1 ,意思是“user”这个资源每秒只能有1个请求进来,多余的请求会触发限流,返回降级数据。

第六步:限流测试,通过浏览器频发访问 “user”资源,当QPS大于1就会触发限流:
在这里插入图片描述

3. Gateway使用Sentinel限流

第一步:在父工程下新建模块springcloudalibaba-order-gateway

第二步:导入gataway基础依赖和配置中心依赖:

<!--gateway依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册与发现-->
<dependency>
	<groupId>com.alibaba.cloud </groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
 <!--        配置中心客户端-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

第三步:主配置类

//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApp {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApp.class);
    }
}

第四步:在http://localhost:8848/nacos/index.html云端进行yaml配置;最后项目中创建bootstrap.yml连接云端(略):

server:
  port: 10030
spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #云端
    gateway:
      discovery:
        locator:
          enabled: false #开放服务名访问方式
          lower-case-service-id: true #服务名小写
      routes:
        - id : user-server #指定服务名
          uri: lb://user-server #去注册中心找这个服务名
          predicates:    #断言,匹配访问的路径
          - Path=/servers/user/**	#服务访问路径
          filters:
            - StripPrefix=2	#请求转发的时候会去掉 /servers/user访问路径
        - id: order-server
          uri: lb://order-server
          predicates:
            - Path=/servers/order/**
          filters:
            - StripPrefix=2

第五步:到这里基础的已经搭建完成,现在开始通过Sentinel对请求进行流控。
还是导入依赖,这里我们需要导入sentinel基础依赖和 sentinel-gateway 整合依赖:

<!--    限流和gataway使用-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
 </dependency>
 <dependency>	
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 </dependency>

第六步:在云端配置Sentinel地址,注意层级关系:

spring:
	cloud:
      sentinel:
          transport:
            dashboard: localhost:1111

第七步:配置限流规则:
启动Gateway,登录sentinel控制台,对url资源进行流控限制,配置方式和前面的配置方式一样。

第八步:编写降级配置类:

@Configuration
public class SentinelConfig {
    public SentinelConfig(){
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                return ServerResponse.ok().body(Mono.just("限流啦,请求太频繁"),String.class);
            }
        });
    }
}

第九步:启动测试 ,启动springcloudalibaba-gateway-server,浏览器向 http://localhost:10030/servers/user/user/1 资源发起访问。

4. 整合Nacos持久化限流规则

第一步:导入基础依赖,springcloudalibaba-user-server工程增加Sentinel和Nacos持久化配置依赖 :

<!--Sentinel和Nacos做持久的-->
<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
   <version>1.5.2</version>
</dependency>

第二步:配置Nacos持久化Sentinel限流规则

[
    {
        "resource": "user",
        "limitApp": "default",
        "grade": 1,
        "count": 10,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

在这里插入图片描述
注意:这里的Data ID没有添加后缀yaml"resource": "user":这里的 user 指的是资源名。

第三步:bootstrap.yml中添加配置持久化nacos地址:

#====================持久化配置=================================        
      datasource:
        flow:
          nacos: #限流持久配置
            server-addr: localhost:8848	#使用nacos的持久
            dataId: application-user-dev	#获取限流的数据源的dataId
            groupId: DEFAULT_GROUP
            rule-type: flow #类型:限流
#=====================================================            

第四步:启动测试 ,启动springcloudalibaba-user-server,浏览器向 http://localhost:10030/servers/user/user/1 资源发起访问,然后观察Sentinel控制台 ’ 流控规则 ’ 是否有了一条限流策略。

5. Nacos持久化Sentinel降级规则

第一步:在Nacos配置列表增加文件 如:application-user-degrade-dev (没有后缀yaml):

[
    {
        "resource": "user", 
        "grade": 0,
        "count": 2,
        "timeWindow": 5
    }
]

解释一下

  • resources : 资源名
  • grade : 慢调用比例 0 ;异常比例 1 ;异常数 2;
  • count : 最大RT,最大平均响应时间
  • timeWindow :时间窗口,即熔断时长

第二步:项目中bootstrap.yml文件中增加配置:

##==================================================================            
        degrade: #降级的配置
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: application-user-degrade-dev
            groupId: DEFAULT_GROUP
            rule-type: degrade

第三步:启动测试,观察sentinel的熔断规则列表。

6. Sentinel熔断

第一步:修改springcloudalibaba-user-serve工程,修改UserController ,通过@SentinelResource注解的fallback="" 属性指定降级方法。

package top.itimmortal.userTest.controller;

//用户服务:暴露接口给订单访问
@RestController
public class UserController {
    @Value("${spring.redis.port}")
    private int port;

    @Autowired
    private IUserService iUserService;


    //订单服务来调用这个方法
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    //注解标记需要限流的资源
    @SentinelResource(value = "user",/*blockHandler = "exceptionHandler",*/fallback = "Userfallback")
    public User getById(@PathVariable("id")Long id){
        //根据id去数据库查询User
        return iUserService.findOne(id);
    }

//    //降级类:参数要和 被降级的方法参数一样
//    public User exceptionHandler(@PathVariable("id")Long id, BlockException e){
//        e.printStackTrace();
//        return new User(-1L,"系统繁忙,请稍后重试");
//    }
    // 熔断降级,参数和返回值与源方法一致
    public User Userfallback(@PathVariable Long id){
        return new User(id, "熔断托底了");
    }
}

第二步:在Sentinel控制台,在族点链路菜单中找到“user”资源,然后点击“降级”按钮添加降级策略。

第三步:启动springcloudalibaba-user-1010工程,频繁访问 http://localhost:10030/servers/user/user/1

7. OpenFeign整合Sentinel熔断

第一步:基础配置,连接云端,Sentinel 客户端接入,启动类还要开启Feign支持。

第二步:在bootstrap.yml中添加配置:

feign:
  sentinel:
    enabled: true #熔断

第三步:给UserFeignClient接口降级:

//Feign根据服务名能够在注册中心找到目标服务的通信地址
@FeignClient(value = "user-server",fallbackFactory = UserClientFallback.class)
public interface UserFeignClient {
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    User getById(@PathVariable("id")Long id);
}

第四步:编写降级类:

@Component
public class UserClientFallback implements FallbackFactory<UserFeignClient> {
    @Override
    public UserFeignClient create(Throwable throwable) {
        return new UserFeignClient() {
            @Override
            public User getById(Long id) {
                return new User(-1L,"降级降级降级");
            }
        };
    }
}

第五步:启动测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值