前言
Spring Cloud Alibaba 默认为 Sentinel 整合了 Servlet、RestTemplate、FeignClient 和 Spring WebFlux。Sentinel 在 Spring Cloud 生态中,不仅补全了 Hystrix 在 Servlet 和 RestTemplate 这一块的空白,而且还完全兼容了 Hystrix 在 FeignClient 中限流降级的用法,并且支持运行时灵活地配置和调整限流降级规则。
这里我们为提供者服务整合Sentinel,添加流量控制和服务降级,保证应用程序的健壮和稳定性。
一、准备
1. 引入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
2. 配置控制台信息
连接到控制台是为了更好地观察和使用Sentinel
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
二、定义资源
1. Controller
package org.example.nacos.provider.controller;
import org.example.nacos.provider.service.SentinelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* Create by zjg on 2024/8/26
*/
@RestController
public class SentinelController {
@Autowired
private SentinelService service;
@GetMapping(value = "/hello/{name}")
public String apiHello(@PathVariable("name") String name) {
return service.sayHello(name);
}
}
2. Service
package org.example.nacos.provider.service;
/**
* Create by zjg on 2024/8/26
*/
public interface SentinelService {
public String sayHello(String name);
}
3. ServiceImpl
这里我们使用注解
@SentinelResource
定义了一个资源
package org.example.nacos.provider.service.impl;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.example.nacos.provider.service.SentinelService;
import org.springframework.stereotype.Service;
/**
* Create by zjg on 2024/8/26
*/
@Service
public class SentinelServiceImpl implements SentinelService {
@Override
@SentinelResource(value = "sayHello")
public String sayHello(String name) {
return "Hello, " + name;
}
}
三、访问控制台
1. 发起请求
2. 访问控制台
大家从控制台可以看到我们访问的请求和自定义的资源
sayHello
都已经成功添加到控制台,我们可以通过控制台进一步完成流控和熔断等等功能。
总结
这里讲一下为什么要使用注解去完成资源的定义,因为其他方式或多或少存在代码侵入,我感觉不友好,而使用注解的方式,可以很轻松地完成这个功能。