java连接sentinel清除缓存,SpringCloud Alibaba 整合 Sentinel 实现服务降级

上篇文章我们讲了 SpringCloud Alibaba 引入 Feign,点此直达

本文讲解引入 Sentinel 实现服务降级

Sentinel服务降级官方文档:点此

先说一下,什么是服务降级,就是我们调用一个接口报错了,或者访问很慢,我们选择捕获异常,然后调用预先准备的失败处理逻辑。

通常服务降级和熔断是一起讲的,熔断的话是判断异常次数或者超时时间大于一定范围或满足一次阈值触发,然后直接降级,不再调用服务方。

本文主要介绍服务讲解,下篇文章介绍 Sentinel 客户端的使用,里面会包含熔断的配置。

那下面就直接上代码了

一、引入 Sentinel

对比上一篇文章,主要改动了如下4处代码

d43e14c5ecd04583e2d4004c68c6720b.png

1、添加 alibaba sentinel 依赖

pom.xml

com.alibaba.cloud

spring-cloud-starter-alibaba-sentinel

2.1.1.RELEASE

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 服务列表如下

9cdd116df5fa22c25b565c1d71021ae6.png

然后访问消费者接口,查看其调用提供者服务接口是否会报错

d989e03d0c0f15905393aab3b0b467c0.png

如图,可见服务提供者调用失败,进入了我们 fallback 实现里去了

原理是什么呢?就是抛出的异常被 try catch 了,然后调用了 fallback 实现类

下一篇文章介绍 Sentinel 客户端使用,实现流量控制和熔断设置,点此直达

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值