一、概述
二、Sentinel式方法级降级
2.1 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--新版本的nacos要添加 spring-cloud-starter-loadbalance 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.2 配置文件
spring:
application:
name: app-server # 微服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos注册中心地址
username: nacos
password: nacos
2.3 修改处理器类
为控制器类中想要降级的方法添加服务降级。
先在该方法上添加@SentinelResource注解,并在DepartController类中定义降级方法。 该方法返回值与参数类型必须与原方法的相同,方法名可以随意。
@SentinelResource(fallback = "queryByIdFallback")
@GetMapping("/queryById/{id}")
public User queryById(@PathVariable("id") int id) {
return userService.queryById(id);
}
// 定义一个getHandle()方法的服务降级方法
public User getHandleFallback(int id) {
User user = new User();
user.setId(id);
user.setName("Sentinel式方法级降级执行了!");
return user;
}
也可以在降级方法中增加一个Throwable类型的参数,用于获取到降级时相应异常对象。
public Depart getHandleFallback(int id, Throwable throwable) {
Depart depart = new Depart();
depart.setId(id);
depart.setName("Sentinel式方法级降级执行了!" + throwable.getMessage());
return depart;
}
2.4 测试
在浏览器或者使用PostMan等工具测试:http://localhost:8080/consumer/depart/get/1
三、Sentinel式方类降级
3.1 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--新版本的nacos要添加 spring-cloud-starter-loadbalance 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
3.2 配置文件
spring:
application:
name: app-server # 微服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos注册中心地址
username: nacos
password: nacos
3.3 定义降级类
定义的降级类所在包没有要求,类名没有要求。在该类中定义的方法均为业务需要的降级方法。降级类中的方法必须是静态方法,方法返回值与参数类型必须与原方法的相同,方法名可以随意。不过,也可以在降级方法中增加一个Throwable类型的参数,用于获取到降级时相应异常对象。
public class ControllerFallback {
/**
* 定义一个getHandle()方法的服务降级方法
*
* @param id
* @param throwable 异常信息
* @return
*/
public static User queryByIdFallback(int id, Throwable throwable) {
User user = new User();
user.setId(id);
user.setName("Sentinel式类级降级!" + throwable.getMessage());
return user;
}
/**
* 定义一个listHandle()方法的服务降级方法
*
* @param throwable
* @return
*/
public static List<User> listHandleFallback(Throwable throwable) {
List<User> list = new ArrayList<>();
User user = new User();
user.setName("Sentinel式类级降级!" + throwable.getMessage());
list.add(user);
return list;
}
}
3.4 修改处理器类
在处理器Controller中想要降级的的方法上添加@SentinelResource注解,指定具体的降级类的降级方法。
@SentinelResource(fallback = "getHandleFallback", fallbackClass = ControllerFallback.class)
@GetMapping("/queryById/{id}")
public User queryById(@PathVariable("id") int id) {
return userService.queryById(id);
}
@SentinelResource(fallback = "listHandleFallback", fallbackClass = ControllerFallback.class)
@GetMapping("/list")
public List<User> list() {
return userService.list();
}
3.5 测试
在浏览器或者使用PostMan等工具测试:http://localhost:8080/consumer/depart/get/1
四、Feign式方类降级
4.1 添加依赖
<!-- sentinel依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- feign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--新版本的nacos要添加 spring-cloud-starter-loadbalance 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
4.2 配置文件
spring:
application:
name: app-server # 微服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos注册中心地址
username: nacos
password: nacos
openfeign:
lazy-attributes-resolution: true # openfeign懒加载:解决sentinel依赖与openfeign依赖冲突
# 开启Sentinel对Feign的支持
feign:
sentinel:
enabled: true
4.3 定义降级类
降级类定义的包与类名没有要求,但要求必须实现Feign接口,且其生命周期要交由Spring容器管理,类上的@RequestMapping的内容要与Controller处理器上的相同,但在最前必须要添加/fallback的URI。
@Component // 交由Spring容器管理
@RequestMapping("/fallback/provider/depart") // 内容要与Controller处理器上的相同,并在最前必须要添加/fallback
public class UserServiceFallback implements UserService {
@Override
public boolean save(User user) {
System.out.println("save()方法的降级执行了");
return false;
}
@Override
public boolean deleteById(int id) {
System.out.println("deleteById()方法的降级执行了");
return false;
}
@Override
public boolean update(User user) {
System.out.println("update()方法的降级执行了");
return false;
}
@Override
public Depart selectById(int id) {
System.out.println("selectById()方法的降级执行了");
User user = new User();
user.setId(id);
user.setName("Feign式类级降级");
return user;
}
@Override
public List<Depart> list() {
System.out.println("list()方法的降级执行了");
List<User> list = new ArrayList<>();
User user = new User();
user.setName("Feign式类级降级");
list.add(user);
return list;
}
}
4.3 修改Feign接口
指定要使用的服务降级类。在Feign接口上添加@FeignClient注解,在@FeignClient注解的value属性中指定要消费的微服务名称(调用服务配置文件中的spring.application.name的值);在@FeignClient注解的fallback属性中指定要使用的降级类;在@FeignClient注解的path属性中指定调用服务Controller中的公共URL(被调用模块中Controller类上面@RequestMapping的value值)。
@FeignClient(value = "user-provider",
path = "/provider/user",
fallback = UserServiceFallback.class)
public interface UserService {
@PostMapping("/save")
boolean save(@RequestBody User user);
@DeleteMapping("/deleteById/{id}")
boolean deleteById(@PathVariable("id") int id);
@PutMapping("/update")
boolean update(@RequestBody User user);
@GetMapping("/selectById/{id}")
User selectById(@PathVariable("id") int id);
@GetMapping("/list")
List<User> list();
}
4.4 测试
在浏览器或者使用PostMan等工具测试:http://localhost:8080/consumer/depart/get/1