服务容错保护Hystrix

(一)理论知识
1.Hystrix工作原理
熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压,最终导致自身服务瘫瘓的一种机制,它的功能类似电路的保险丝,其目的是为了阻断故障,从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件,具有服务容错保护功能。
在高流量情况下,一个后端的依赖延迟可能会导致所有服务的资源在数秒内变的饱和,这也就意味着,后续如果再有请求将无法提供服务,应用会出现故障。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列、线程和其他资源,从而导致整个系统出现更多级联故障,如图1所示。
在这里插入图片描述

图1 高流量情况下导致整个系统出现更多级联故障
Hystrix的出现就是为了解决上述问题的,它封装了每个依赖项,每个依赖项彼此隔离,当延迟发生时,它会被限制在资源中,并包含回退逻辑,该逻辑决定在依赖发生任何类型故障时应作出何种响应,如图2所示。
在这里插入图片描述

图2 回退逻辑
(二)开发流程
1.搭建eureka-server
(1)创建项目,引入依赖
使用Spring Initializr方 式创建一个名称为eureka-server和eureka-server-another的Spring Boot项目,这里将Group命名为com.itheima,将Artifact 命名为eureka-server,在pom.xml文件中添加Eureka Server依赖。
(2)添加Eureka的相关配置
在全局配置文件application.yml中添加Eureka的相关配置信息,如图3所示。
在这里插入图片描述

图3 全局配置文件application.yml中添加Eureka的相关配置信息
(3)在项目启动类添加@EnableEurekaServer注解
在项目启动类EurekaServerApplication.上添加@EnableEurekaServer注解开启Eureka Server功能。
(4)启动服务
测试服务搭建成功,如图4所示。
在这里插入图片描述

图4 测试服务搭建成功
2. 搭建eureka-hystrix-client
(1)创建项目,引入依赖
使用Spring Initializr方式创 建一个名称为eureka-hystrix-client的Spring Boot项目,这里将Group命名为com. itheima,将Artifact命名为eureka-hystrix-client,并添加Eureka Client、 Web、Feign、 Ribbon、 Hystrix依赖, Hystrix依赖如图5所示。
在这里插入图片描述

图5 Hystrix依赖
(2)开启熔断功能
在eureka- hystrix-client的启动类EurekaHystrixClientApplicat ion中添加@EnableHystrix注解启动熔断功能,如图6所示。
在这里插入图片描述

图6 添加@EnableHystrix注解启动熔断功能
(3)创建config包,在config包下创建HystrixConfig类
如图7所示。
在这里插入图片描述

图7 创建HystrixConfig类
(4)创建controller包
服务提供者eureka-provider中创建controller包,创建controller包,并在controller包下创建HystrixController类,在HystrixController类中创建一个hi ()方法。创建HystrixController类如图8所示。
在这里插入图片描述

图8创建HystrixController类
(5)新建service包,在service包下新建LocalItemService类
被@HystrixCommand注解修饰的hi()方法就启动了Hystrix熔断器的功能fallbackMethod属性定义的是处理回退( fallback)逻辑的方法。如果必须在fallback逻辑方法中远程调度其他服务,最好在远程调度其他服务时,也加上,熔断器。
在这里插入图片描述

图9 新建LocalItemService类
(6)启动服务
测试服务搭建成功,如图6所示。
在这里插入图片描述

图6 测试服务搭建成功
4. 创建hystrix-provider
(1)创建项目,引入依赖
使用Spring Initializr方式创建一个 名称为hystrix-provider的Spring Boot项目,这里将Group命名为com. itheima,将Artifact命名为hystrix- provider,并添加Eureka Client、Test、Web依赖。
(2)新建controller包,在controller包下的创建HystrixController类
新建controller包,在controller包下的创建HystrixController类,如图7所示。
在这里插入图片描述

图7 创建HystrixController类
(3)启动测试项目
依次启动项目server, provider, consumer, hystrix。启动成功后,使用浏览器访问http://localhost:7000和http://loaclhost:8764/hi?id=12,如图8、9所示。
在这里插入图片描述

图8 使用浏览器访问ttp://loaclhost:7000
在这里插入图片描述

图9 使用浏览器访问http://loaclhost:8764/hi?id=12
5.测试
依次启动项目server, provider, consumer, hystrix。启动成功后,使用浏览器访问http://localhost:7000和http://loaclhost:8764/hi?id=12,如图8、9所示。

图8 使用浏览器访问ttp://loaclhost:7000
在这里插入图片描述

图9 使用浏览器访问http://loaclhost:8764/hi?id=12
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是一个比较复杂的需求,需要涉及到多个方面的技术。下面我尝试给你提供一个基本的架构思路和代码实现示例,供你参考。 1. 系统功能服务设计 根据需求,我们需要实现两个系统功能服务,可以分别命名为ServiceA和ServiceB。为了方便演示,这里我们简化服务功能,ServiceA提供一个加法运算服务,ServiceB提供一个字符串反转服务。 ServiceA代码示例: ``` @RestController public class ServiceAController { @GetMapping("/add") public int add(@RequestParam("a") int a, @RequestParam("b") int b) { return a + b; } } ``` ServiceB代码示例: ``` @RestController public class ServiceBController { @GetMapping("/reverse") public String reverse(@RequestParam("str") String str) { return new StringBuilder(str).reverse().toString(); } } ``` 2. Eureka服务发现 为了实现服务之间的通信,我们可以使用Eureka技术实现服务发现和注册。Eureka是一个基于REST的服务,用于定位服务,以实现中间层服务器的负载平衡和故障转移。下面是Eureka服务端和客户端的代码示例。 Eureka服务端代码示例: ``` @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } ``` Eureka客户端代码示例: ``` @SpringBootApplication @EnableDiscoveryClient public class ServiceAApplication { public static void main(String[] args) { SpringApplication.run(ServiceAApplication.class, args); } } ``` ``` @SpringBootApplication @EnableDiscoveryClient public class ServiceBApplication { public static void main(String[] args) { SpringApplication.run(ServiceBApplication.class, args); } } ``` 3. Hystrix服务容错保护服务降级 为了保证系统的健壮性,我们可以使用Hystrix技术实现服务容错保护服务降级。Hystrix是一个用于处理分布式系统的延迟和容错的库,它提供了保护和控制分布式系统间组件的交互。 下面是ServiceA服务Hystrix代码示例: ``` @RestController public class ServiceAController { @Autowired private ServiceBClient serviceBClient; @GetMapping("/add") @HystrixCommand(fallbackMethod = "addFallback") public int add(@RequestParam("a") int a, @RequestParam("b") int b) { return serviceBClient.reverse(a, b); } public int addFallback(int a, int b) { return -1; } } ``` 下面是ServiceB服务Hystrix代码示例: ``` @RestController public class ServiceBController { @GetMapping("/reverse") @HystrixCommand(fallbackMethod = "reverseFallback") public String reverse(@RequestParam("str") String str) { if (str == null || str.isEmpty()) { throw new IllegalArgumentException("String cannot be empty"); } return new StringBuilder(str).reverse().toString(); } public String reverseFallback(String str) { return ""; } } ``` 4. 网关路由功能 为了实现网关路由功能,我们可以使用Spring Cloud Gateway技术,它是Spring Cloud生态系统中的网关解决方案。它基于Spring Framework 5,Project Reactor和Spring Boot 2.0,可以用作Zuul的替代方案。 下面是网关路由配置文件示例: ``` spring: cloud: gateway: routes: - id: serviceA uri: lb://service-a predicates: - Path=/serviceA/** - id: serviceB uri: lb://service-b predicates: - Path=/serviceB/** ``` 5. 接口自动生成在线接口文档 为了方便对外提供服务接口,我们可以使用Swagger技术自动生成在线接口文档。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的Web服务。 下面是Swagger配置示例: ``` @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example")) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Example API") .description("Example API reference for developers") .version("1.0") .build(); } } ``` 以上是一个基本的后端微服务架构代码示例,实现了多个功能模块,包括服务发现、服务容错保护服务降级、网关路由和在线接口文档。由于每个公司的技术栈和业务需求不同,实际的架构实现可能会有所不同,需要根据具体情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

两壶若水

感谢您的鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值