随笔 - 1357  文章 - 0  评论 - 1104  阅读 - 1941万

Ribbon使用Hystrix

1、导入依赖spring-cloud-starter-hystrix

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

 

2、消费启动类开启@EnableCircuitBreaker

复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
//开启Ribbon
@RibbonClient(name="cloud-producer")
//启动断路器支持(Hystrix)
@EnableCircuitBreaker
public class RibbonConsumerApplication {

    @Bean
    @LoadBalanced //负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }
    
}
复制代码

 

3、TestService——设置断路器核心类

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@Repository
public class TestService {
    
    @Autowired
    private RestTemplate restTemplate;
    
    //设置断路器,当此方法无法应答时(把mima-cloud-producer服务停掉),调用getError方法
    @HystrixCommand(fallbackMethod="getError")
    public String get(String id) {
        System.out.println(Thread.currentThread().getName()+".get before...");
        String result = restTemplate.getForObject("http://cloud-producer/get/"+id, String.class);
        System.out.println(Thread.currentThread().getName()+".get end...result="+result);
        return result;
    }
    
    public String getError(String id) {
        System.out.println(Thread.currentThread().getName()+"断路器启动");
        return "断路器fallback返回error";
    }
}
复制代码

 

4、TestController——测试类

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.mimaxueyuan.consumer.robbin.service.TestService;

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/ribbon/get/{id}")
    public String get(@PathVariable String id) {
        return testService.get(id);
    }
}
复制代码

 

以上代码在cloud-consumer-ribbon-hystrix服务中,模拟远程调用cloud-producer服务。

5、模拟测试
5.1、启动服务
启动cloud-consumer-ribbon-hystrix、cloud-producer服务,保证服务正常。

5.2、正常请求

5.3、服务挂掉请求,触发断路器
把cloud-producer服务关闭,这时http://localhost:8807/ribbon/get/123456请求无法应答,会调用getError方法,触发断路器

5.4、多次请求控制台会打印如下信息:

posted on   Ruthless  阅读(905)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示