在本系列的 上一篇文章 中,我们演示了如何适用 Gateway 的限流功能。本文中,我们将演示如何使用 Hystrix 的熔断功能。
新建一个微服务项目
在 IDEA 中新建一个普通的 maven 项目,将其 groupId 命名为: cn.com.hohistar.tutorial, artifactId 命名为: springcloud-hystrix-service, 然后将项目的 pom.xml 替换为如下内容:
1 |
|
新增服务消费者
在本示例中,我们将构建一个访问(消费)前面建立的 todo-service 的类,并在该类的方法中使用熔断机制。
新建数据类
在 src/main/java 中新建一个名为: cn.com.hohistar.tutorial.springcloudhystrixservice.model 的包(package), 并在其中增加一个名为: Todo 的类, 代码如下:
1 |
|
因为所有的服务返回都别规范为 ApiResult 的格式,所以还需要加入 ApiResult 类的定义在 model 包中。 代码如下:
1 |
|
定义访问服务
在 src/main/java 中新建一个名为: cn.com.hohistar.tutorial.springcloudhystrixservice.service 的包(package),并在其中新增一个名为: HystrixedClientService 的类, 并填入以下代码:
1 |
|
新建API服务
在 src/main/java 中新建一个名为: cn.com.hohistar.tutorial.springcloudhystrixservice.api 的包(package),并在其中新增一个名为: HystrixedClientController 的类, 并填入以下代码:
1 |
|
新建启动类
在 src/main/java 中新建一个名为: cn.com.hohistar.tutorial.springcloudhystrixservice 的包(package),并在其中新增一个名为: SpringcloudHystrixServiceApplication 的类, 并填入以下代码:
1 |
|
建立配置文件
在 src/main/resource 目录中新建名为 application.yml 的文件,加入以下内容:
1 | server: |
启动应用
启动应用,然后在浏览器中访问:
1 | http://localhost:9090/todo |
可以得到 todo-service 中返回的 json 数据。类似如下:
1 | succ":true,"code":null,"msg":null,"data":[{"id":1,"title":"Call Metting","desc":""},{"id":2,"title":"Print File","desc":""}]} |
验证熔断机制
Hystrix默认的超时时间是1秒,也就是服务消费者在等待服务提供者返回信息时,如果超过1秒没有得到返回信息的话,就认为服务提供者故障,直接执行本地设置的降级策略,也就是fallbackMethod指定的方法。
因此我们修改 todo-service 项目,将 cn.com.hohistar.tutorial.springcloudtodoservice.service 包中的 TodoService 类的方法中加入强制延迟 20 秒, 修改后的代码如下:
1 |
|
这时再访问
1 | http://localhost:9090/todo |
可以看到返回的结果为空的 json 数组,并且在后台的日志中能看到 todoFailed 方法被执行了。
修改默认的超时时间
可在 application.yml 中加入一下内容,将超时时间设置为3秒:
1 | hystrix: |