微服务架构整理-(八、SpringCloud实战之Hystrix [1])_应用未采用注册中心机制 还算微服务架构吗

ops/2025/2/2 20:51:06/
        <version>2.2.10.RELEASE</version></dependency>

#### 配置启动类在启动类中使用 `@EnableCircuitBreaker` 注解开启断路器功能

@SpringBootApplication
// 激活EurekaClient
@EnableEurekaClient
//激活Hystrix
@EnableCircuitBreaker
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}


#### 添加熔断机制在服务消费者的方法上添加注解`@HystrixCommand(fallbackMethod="handleTimeout")`,其中fallbackMethod中指定的是服务降级后处理的函数。当在指定的时间里没有响应时,便会回调handle函数。响应时间默认为1000ms,可以通过commandProperties来指定,例如将响应时间设为1500ms,`@HystrixCommand(fallbackMethod = "handleTimeout",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500") })`。
@GetMapping(value = "/buy/{id}")
//@HystrixCommand(fallbackMethod = "handleTimeout")
@HystrixCommand(fallbackMethod = "handleTimeout",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
})
public Product findById(@PathVariable Long id) {Product product = null;URI uri = null;try {uri = new URI("http://service-product/product/" + id);} catch (URISyntaxException e) {e.printStackTrace();}//这里故意弄一个超时,强迫其服务降级try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}product = restTemplate.getForObject(uri, Product.class);return product;
}

#### 服务降级有两种情况可以导致服务降级,一种是调用服务时超时,另一种是调用服务时抛出异常。##### 超时调用服务提供者的方法超时时,Hystrix机制便会进行服务降级,通过回调@HystrixCommand中fallbackMethod指定的函数来进行降级,这种方法虽然得不到用户想要的结果,但保证了服务的可用性,不至于造成雪崩现象。这里需要注意此函数的**返回值以及参数列表**需要与添加熔断的方法保持一致。接上面的代码,这里给出handleTimeout方法。
public Product handle(Long id) {Product product = new Product();product.setId(0L);product.setName("A fake product");product.setPrice(new BigDecimal(0));return product;
}

运行结果 :

{
“id”: 0,
“name”: “A fake product”,
“price”: 0
}


**注意**:超时不管发生在服务调用方,还是服务提供者方都会进行服务降级。针对上面的两段代码,在服务消费者的方法findById上添加的熔断机制,findById中调用了服务提供者的方法 http://service-product/product/{id}, 不管在哪个方法中发生了超时,都会回调handleTimeout方法。##### 异常当调用服务时发生了异常,默认情况下也是回调服务降级函数,如果在发生异常时不想进行服务降级,可以在@HystrixCommand添加`ignoreExceptions = Exception.class` 。例如:  **异常服务降级**:
@GetMapping(value = "/buy1/{id}/{price}")
@HystrixCommand(fallbackMethod = "handleException")
public Product findByIdAndPrice1(@PathVariable Long id, @PathVariable BigDecimal price) {Product product = null;// 这里故意弄一个运行时异常超时,强迫其服务降级int i = 1 / 0;product = restTemplate.getForObject("http://service-product/product/{1}/{2}", Product.class, id, price);return product;
}public Product handleException(Long id, BigDecimal price, Throwable throwable) {Product product = new Product();product.setId(0L);product.setName(throwable.getMessage());product.setPrice(new BigDecimal(0));return product;
}

运行结果:

{
“id”: 0,
“name”: “/ by zero”,
“price”: 0
}


**异常服务不降级**:  当将注解改成:`@HystrixCommand(fallbackMethod = "handleException", ignoreExceptions = Exception.class)`时,最终的运行结果为:

{
“timestamp”: “2022-05-24T14:57:00.759+0000”,
“status”: 500,
“error”: “Internal Server Error”,
“message”: “/ by zero”,
“path”: “/order/buy1/1/8000”
}


后端log为:

java.lang.ArithmeticException: / by zero


http://www.ppmy.cn/ops/155123.html

相关文章

DeepSeek的提示词使用说明

一、DeepSeek概述 DeepSeek是一款基于先进推理技术的大型语言模型&#xff0c;能够根据用户提供的简洁提示词生成高质量、精准的内容。在实际应用中&#xff0c;DeepSeek不仅能够帮助用户完成各类文案撰写、报告分析、市场研究等工作&#xff0c;还能够生成结构化的内容&#…

【汽车电子架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

2025全自动企业站群镜像管理系统 | 支持繁简转换拼音插入

2025全自动企业站群镜像管理系统 | 支持繁简转换拼音插入 在全球化的今天&#xff0c;企业面临着管理多站点的挑战&#xff0c;尤其是跨语言和地理位置的站点。为此&#xff0c;我们设计了一套基于PHP的全自动企业站群镜像管理系统&#xff0c;它不仅能够自动化站点的管理&…

高阶C语言|深入理解字符串函数和内存函数

文章目录 前言1.求字符串长度1.1 字符串长度函数&#xff1a;strlen模拟实现 2.长度不受限制的字符串函数2.1 字符串拷贝函数&#xff1a;strcpy模拟实现 2.2 字符串连接函数&#xff1a;strcat模拟实现 2.3 字符串比较函数&#xff1a;strcmp模拟实现 3.长度受限制的字符串函数…

Kafka SSL(TLS)安全协议

文章目录 Kafka SSL&#xff08;TLS&#xff09;安全协议1. Kafka SSL 的作用1.1 数据加密1.2 身份认证1.3 数据完整性1.4 防止中间人攻击1.5 确保安全的分布式环境1.6 防止拒绝服务&#xff08;DoS&#xff09;攻击 2. Kafka SSL 配置步骤&#xff08;1&#xff09;创建 SSL 证…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

Linux基础

一. Linux 主要目录 介绍&#xff1a;Linux 系统的文件系统遵循类似 UNIX 的目录结构&#xff0c;根目录 (/) 是最顶层的目录&#xff0c;下面包含了不同的子目录&#xff0c;承载着系统和应用程序的文件。 / (根目录) 这是整个文件系统的起点&#xff0c;所有其他目录和文件都…

【VUE】Vue2中Vue.extend方法

在 Vue.js 2.x 版本中&#xff0c;Vue.extend() 方法被用于创建一个新的 Vue 子类&#xff0c;可以在该子类上扩展一些属性、指令和组件选项等&#xff0c;然后进行实例化。 比如&#xff0c;可以在创建一些类似 loading 式的函数式插件时&#xff0c;使用&#xff1a; 在 Vue…