SpringCloud Alibaba 整合 Sentinel 实现服务降级

avatar 2021年01月29日21:06:11 0 122 views

上篇文章我们讲了 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 客户端使用,实现流量控制和熔断设置,点此直达

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
可以匿名评论或者登录后台评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0