在前一章的基础上,我们继续学习。
https://blog.51cto.com/u_13312531/6546544
使用目的:在最后一章中,我们使用Openfeign完成了服务间的呼叫。如果现在有大量的服务,每个服务都有几个节点,其中一个节点出现故障,添加的请求被阻塞。大量积累的请求会崩溃服务,可能导致级联失败,甚至整个链路失败,这就是所谓的服务雪崩,严重可能导致系统挂断。为了避免这种情况,我们需要采取必要的容错保护机制。
一、简介Hystrix是Netflix提供断路器、资源隔离和自我修复功能的重要组成部分。作为断路器,Hystrix可以防止级联失败。
二、问题出现继续使用上一章的开发环境,两项服务在正常情况下都成功开通。
现在我们关闭库存服务,然后要求商品服务的功能。因为库存服务的请求是在商品服务中使用的,我们来看看是否会报错。
1.首先关闭库存服务。
2.然后我们继续用Postman进行测试。
我们发现接口没有正常的返回数据,也没有找到库存服务的异常信息。
三、如何处理我们实现的效果是,即使服务意外关闭,即使服务继续调用,整个系统仍然可以正常运行。
接下来,我们用Hystrix来解决这个问题,我们需要在商品模块中处理以下问题:
1.添加依赖
<!--hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
完整的pom文件如下所示:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.example</groupId> <artifactId>mymall</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>mymall-goods</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.example</groupId> <artifactId>mymall-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--cloud相关依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>0.2.2.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> <!--OpenFeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> </dependencies></project>
2.在application.开启hystrixxyml
feign: hystrix: # 打开hystrix enabled: true
完整的application.yml文件如下所示:
spring: application: # 服务名称 name: goods-service cloud: nacos: discovery: # nacos server地址 server-addr: 127.0.0.1:848.erver: port: 8084feign: hystrix: # 打开hystrix enabled: true
3.在启动类中添加@EnableHystrix注释,使系统支持hystrix功能
package com.example.mymall;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import org.springframework.cloud.openfeign.EnableFeignClients;/** * @author qx * @date 2023/06/25 * @desc 商品模块启动类 */@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients(basePackages = "com.example.mymall")@EnableHystrixpublic class MyMallGoodsApplication { public static void main(String[] args) { SpringApplication.run(MyMallGoodsApplication.class, args); }}
4.创建StockclientFallback类,实现StockclientFeign接口,实现Feign客户端远程调用失败的回调处理
package com.example.mymall.feign;import com.example.mymall.entity.Stock;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;/** * @author qx * @date 2023/06/26 * @desc 库存服务异常回调 */@Component@Slf4jpublic class StockClientFallback implements StockClientFeign { @Override public Long addStock(Stock stock) { log.error(“库存服务-库存功能不能添加”); return 0L; } @Override public Integer getInventoryByGoodsId(Long goodsId) { log.error(“库存服务-库存获取功能不可用”); return 0; }}
5.然后将回调属性添加到以前配置的Feign客户端中,并在属性fallback中调用自定义异常回调类
类似:@FeignClient(value="stock-service",fallback=StockClientFallback.class)
package com.example.mymall.feign;import com.example.mymall.entity.Stock;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;/** * @author qx * @date 2023/06/25 * @desc 库存服务feign客户端 */@FeignClient(value = "stock-service",fallback = StockClientFallback.class)public interface StockClientFeign { /** * 调用添加库存的接口 */ @PostMapping("/stock/add") Long addStock(@RequestBody Stock stock); /** * 根据商品ID调用库存接口 * * @param goodsId 商品ID * @return 库存数量 */ @GetMapping("/stock/getinventory/{goodsId}") Integer getInventoryByGoodsId(@PathVariable("goodsId") Long goodsId);}
四、测试我们继续利用以前的服务环境,重新开放商品服务,关闭库存服务。
现在我们继续测试Postman上添加的商品:
我们发现添加商品的接口已经成功要求,但我们没有启动库存模块。控制台打印了库存服务的提示
Hibernate: insert into t_goods (create_time, description, goods_name, price, update_time) values (?, ?, ?, ?, ?)2023-06-26 09:41:20.826 INFO 5848 --- [stock-service-1] c.netflix.config.ChainedDynamicProperty : Flipping property: stock-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 21474836472023-06-26 09:41:20.870 INFO 5848 --- [stock-service-1] c.netflix.loadbalancer.BaseLoadBalancer : Client: stock-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=stock-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null2023-06-26 09:41:20.878 INFO 5848 --- [stock-service-1] c.n.l.DynamicServerListLoadBalancer : Using serverListUpdater polingSerlistupdater2023-06-26 09:41:20.889 INFO 5848 --- [stock-service-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client stock-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=stock-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList@3e164f682023-06-26 09:41:20.954 ERROR 5848 --- [stock-service-1] c.e.mymall.feign.StockClientFallback : 库存服务-库存功能的添加不可用
我们刷新了数据表,发现新增了商品数据。
在没有新库存数据的情况下,我们将更新库存数据表。
,这可以使我们的系统在服务没有启动或故障的情况下继续正常运行,即使它被调用。
好了,我们的Hystrix实现了断路器的功能。