SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

Netflix创建了一个名为Hystrix的库,它实现了断路器模式。主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线。

开发准备

开发环境

JDK:1.8

SpringBoot:2.1.1.RELEASE

SpringCloud:Finchley

注:不一定非要用上述的版本,可以根据情况进行相应的调整。需要注意的是SpringBoot2.x以后,jdk的版本必须是1.8以上!

确认了开发环境之后,我们再来添加相关的pom依赖。

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

注: 实际上这里是不需要Hystrix依赖的,Fegin已经添加了Hystrix依赖。

SpringCloud Hystrix 示例

由于Hystrix机制是在微服务项目上进行的,并且Fegin中包含了该机制。所以这里我们可以把之前的springcloud-feign的项目进行简单的改造就行了。

服务端

首先是服务端这块,为了进行区分,创建一个springcloud-hystrix-eureka的项目,用于做注册中心。 代码和配置和之前的基本一样。
application.properties配置信息:

配置信息:

spring.application.name=springcloud-hystrix-eureka-server server.port=8002 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:8002/eureka/

配置说明:

spring.application.name: 这个是指定服务名称。

server.port:服务指定的端口。

eureka.client.register-with-eureka:表示是否将自己注册到Eureka Server,默认是true。

eureka.client.fetch-registry:表示是否从Eureka Server获取注册信息,默认为true。

eureka.client.serviceUrl.defaultZone: 这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址。

服务端这边只需要在SpringBoot启动类添加@EnableEurekaServer注解就可以了,该注解表示此服务是一个服务注册中心服务。

代码示例:

@EnableEurekaServer @SpringBootApplication public class HystrixEurekaApplication { public static void main(String[] args) { SpringApplication.run(HystrixEurekaApplication.class, args); System.out.println("hystrix注册中心服务启动..."); } } 客户端

这里我们把之前的springcloud-fegin-consumer项目稍微改造下,项目名改为springcloud-hystrix-consumer。然后在application.properties配置文件新增如下配置, feign.hystrix.enabled配置表示是否启用熔断机制。

feign.hystrix.enabled=true

增加了配置之后,我们在来把之前的fegin进行定义转发服务的@FeignClient注解进行添加一个回调方法fallback。代码改造后的实现如下:

@FeignClient(name= "springcloud-hystrix-consumer2",fallback = HelloRemoteHystrix.class) public interface HelloRemote { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); }

最后新增一个回调类,用于处理断路的情况。这里我们就简单的处理下,返回错误信息即可!

代码示例:

@Component public class HelloRemoteHystrix implements HelloRemote{ @Override public String hello(@RequestParam(value = "name") String name) { return name+", 请求另一个服务失败!"; } }

其余的代码就不展示了,和之前的springcloud-fegin-consumer项目中的一致,详细的可以在这篇博文SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)进行查看。

然后在把之前的springcloud-feign-consumer2进行简单的改造下,项目名称改为springcloud-hystrix-consumer2。然后更改下配置的端口。

功能测试

完成如上的工程开发之后,我们依次启动服务端和客户端的springcloud-hystrix-eureka、springcloud-hystrix-consumer和springcloud-hystrix-consumer2这三个程序,然后在浏览器界面输入::8002/,即可查看注册中心的信息。

首先在浏览器输入:

:9004/hello/pancm

控制台打印:

接受到请求参数:pancm,进行转发到其他服务

浏览器返回:

pancm,Hello World

然后再输入:

:9005/hello?name=pancm

浏览器返回:

pancm,Hello World

说明程序运行正常,fegin的调用也ok。这时我们在进行断路测试。
停止springcloud-hystrix-consumer2这个服务,然后在到浏览器输入::9004/hello/pancm 进行查看信息。

控制台打印:

接受到请求参数:pancm,进行转发到其他服务

浏览器返回:

pancm, 请求另一个服务失败!

出现以上结果说明断路器的功能已经实现了。

示例图:

在这里插入图片描述

SpringCloud Hystrix-Dashboard Hystrix-Dashboard 介绍

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspfwj.html