上篇文章我们讲了 SpringCloud Alibaba 引入 Feign,点此直达
本文讲解引入 Sentinel 实现服务降级
示例代码地址:https://github.com/saysky/nacos-spring-cloud-example
Sentinel服务降级官方文档:点此
先说一下,什么是服务降级,就是我们调用一个接口报错了,或者访问很慢,我们选择捕获异常,然后调用预先准备的失败处理逻辑。
通常服务降级和熔断是一起讲的,熔断的话是判断异常次数或者超时时间大于一定范围或满足一次阈值触发,然后直接降级,不再调用服务方。
本文主要介绍服务讲解,下篇文章介绍 Sentinel 客户端的使用,里面会包含熔断的配置。
那下面就直接上代码了
一、引入 Sentinel
对比上一篇文章,主要改动了如下4处代码
1、添加 alibaba sentinel 依赖
pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
2、配置文件里 Feign 开启 Sentinel
application.yml
server:
port: 8081
spring:
application:
name: demo-consumer-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
feign:
sentinel:
# 开启Sentinel对Feign的降级
enabled: true
主要关注 后面几行
3、给 Feign 接口设置 fallback 处理类
package com.example.consumer.feign;
import com.example.consumer.feign.fallback.DemoProviderServiceFallback;
import com.example.consumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
/**
* 这个 feign 接口一般由服务提供方提供jar
* 或者消费方根据服务方的接口文档,自己写这个feign接口
* 如果调用 DemoProviderService 接口失败,会自动调用降级的实现(DemoProviderServiceFallback)
*
* @author 言曌
* @date 2021/1/28 11:42 下午
*/
@FeignClient(value = "demo-provider-service", fallback = DemoProviderServiceFallback.class)
public interface DemoProviderService {
/**
* 模拟获取用户列表
*
* @return
*/
@GetMapping("/user")
String getUserList();
/**
* 模拟根据用户ID查询用户
*
* @return
*/
@GetMapping("/user/{id}")
String getUserById(@PathVariable("id") Long id);
/**
* 模拟添加用户
*
* @return
*/
@PostMapping("/user")
String addUser(@RequestBody User user);
/**
* 模拟更新用户
*
* @return
*/
@PutMapping("/user")
String updateUser(@RequestBody User user);
/**
* 模拟更新用户
*
* @return
*/
@DeleteMapping("/user/{id}")
String deleteUser(@PathVariable("id") Long id);
}
主要看17行
4、Fallback 实现类代码
package com.example.consumer.feign.fallback;
import com.alibaba.fastjson.JSON;
import com.example.consumer.feign.DemoProviderService;
import com.example.consumer.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 如果demo-provider-service服务宕机了,DemoProviderService无法调用了。
* 会自动调用 DemoProviderServiceFallback 里的实现
*
* @author 言曌
* @date 2021/1/29 8:27 下午
*/
@Component
@Slf4j
public class DemoProviderServiceFallback implements DemoProviderService {
@Override
public String getUserList() {
log.error("调用demo-provider-service服务,获取用户列表失败");
return "您操作有点频繁哦,请稍后再试";
}
@Override
public String getUserById(Long id) {
log.error("调用demo-provider-service服务,获取用户信息失败,id:{}", id);
return "您操作有点频繁哦,请稍后再试";
}
@Override
public String addUser(User user) {
log.error("调用demo-provider-service服务,添加用户失败,user:{}", JSON.toJSONString(user));
// TODO 失败做补偿处理
return "您操作有点频繁哦,请稍后再试";
}
@Override
public String updateUser(User user) {
log.error("调用demo-provider-service服务,更新用户失败, user:{}", JSON.toJSONString(user));
// TODO 失败做补偿处理
return "您操作有点频繁哦,请稍后再试";
}
@Override
public String deleteUser(Long id) {
log.error("调用demo-provider-service服务,删除用户失败,id:{}", id);
// TODO 失败做补偿处理
return "您操作有点频繁哦,请稍后再试";
}
}
5、Controller 代码不变
二、测试服务降级
我们启动 consumer 的服务,provider的服务不启动
Nacos 服务列表如下
然后访问消费者接口,查看其调用提供者服务接口是否会报错
如图,可见服务提供者调用失败,进入了我们 fallback 实现里去了
原理是什么呢?就是抛出的异常被 try catch 了,然后调用了 fallback 实现类
下一篇文章介绍 Sentinel 客户端使用,实现流量控制和熔断设置,点此直达
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏