SpringCloud实战:nacos+Hystrix服务熔断与降级详细教程(附git源码)

Springboot-cli 开发脚手架系列



简介

  • 在微服务中断路器在方法执行失败时可以优雅的处理失败,避免跨调用堆栈产生级联失败。

  • 断路器起初会处于关闭状态,允许进行方法的调用。如果因为某种原因,方法调用失败了,断路器就会打开,就不会对失败的方法再执行调用了。此时会调用一个后备方法代替失败的方法返回结果。在调用后备方法的过程中断路器偶尔会进入半开状态,去再次尝试调用发生失败的方法:如果依然失败,断路器就恢复打开状态;如果调用成功,它会认为问题已经解决,断路器回到闭合状态。

  • nacos安装: http://t.csdn.cn/nuufT

1. 环境

  • 依赖
       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
  • 本项目cloud版本
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud.version>2020.0.5</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
        <spring-boot-dependencies.version>2.5.3</spring-boot-dependencies.version>
        <fastjson.version>1.2.80</fastjson.version>
    </properties>
  • 结尾有完整项目源码,这里就不贴完整pom.xml文件了

2. 提供者

  • bootstrap.yml
server:
  port: 9998
# NaCos
spring:
  application:
    name: provider
  # NaCos
  cloud:
    service-registry:
      auto-registration:
        # 是否注册到注册中心
        enabled: true
    nacos:
      discovery:
        server-addr: 192.168.0.251:8848
          # namespace: 1d5a097c-898e-403e-8935-fdbe2cf854f6
        namespace: be88b2b8-987c-4801-a5f1-05b867e6370e
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${spring.cloud.nacos.discovery.namespace}
        file-extension: yaml
        prefix: ${spring.application.name}
  • IndexController接口,模拟一个超时连接
@RestController
@Slf4j
public class IndexController {

    @GetMapping("get")
    public String get() throws InterruptedException {
        Thread.sleep(5000);
        return "喵喵喵";
    }
}

3. 消费者

  • 依赖
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
  • feign.circuitbreaker.enabled 开启服务熔断,Feign默认关闭了对Hystrix的支持,需要在application.yml进行配置
  • feign.httpclient.connection-timeout 设置超时时间 2S
  • bootstrap.yml 完整配置
server:
  port: 9999
# NaCos
spring:
  application:
    name: consumer
  # NaCos
  cloud:
    service-registry:
      auto-registration:
        # 是否注册到注册中心
        enabled: true
    nacos:
      discovery:
        server-addr: 192.168.0.251:8848
        # namespace: 1d5a097c-898e-403e-8935-fdbe2cf854f6
        namespace: be88b2b8-987c-4801-a5f1-05b867e6370e
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${spring.cloud.nacos.discovery.namespace}
        file-extension: yaml
        prefix: ${spring.application.name}

feign:
  # 开启熔断机制
  circuitbreaker:
    enabled: true
  # 设置超时时间
  httpclient:
    connection-timeout: 2000
  • ProviderApi openfeign 接口, fallback用于指定请求错误时的回调,用于降级处理
/**
 * 利用openfeign 调用消费者的api
 * 
 * @author lqd
 */
@FeignClient(value = "provider", fallback = ProviderApiImpl.class)
public interface ProviderApi {
    /**
     * @return ``
     */
    @GetMapping("/get")
    ResponseEntity<String> get();
}
  • 处理错误回调的实现类ProviderApiImpl
@Service
public class ProviderApiImpl implements ProviderApi {

    @Override
    public ResponseEntity<String> get() {
        return ResponseEntity.ok("请求出错啦,进入熔断处理。");
    }
}
  • 编写消费者apiConsumerController
@RestController
@Slf4j
@RequiredArgsConstructor
public class ConsumerController {

    private final ProviderApi providerApi;

    @GetMapping("/test")
    public String get() {
        // 从提供者中获取数据
        ResponseEntity<String> stringResponseEntity = providerApi.get();
        log.info("从提供者中获取数据:{}", stringResponseEntity);
        return stringResponseEntity.getBody();
    }
}

4. 效果测试

  • 浏览器访问localhost:9999/test
    ![在这里插入图
  • 可以看到我们的服务熔断降级生效了

6. 源码分享

本项目已收录

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值