断路器Hystrix(Feign)
上一篇中我们讲了 断路器Hystrix(Ribbon) 本章讲解Feign+Hystrix已经Request请求传递,各种奇淫技巧….
- Hystrix
Hystrix支持回退概念:当 断路器
打开或运行错误时,执行默认的代码,给@FeignClient
定义一个fallback
属性,设置它实现回退的,还需要将您的实现类声明为Spring Bean。
官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign-hystrix-fallback
- 准备工作
1.启动Consul
2.创建 battcn-provider
和 battcn-consumer
如果看了上一章的,可以直接copy代码复用
- battcn-provider
- pom.xml
1 |
<dependencies> |
- ProviderApplication.java(有变化)
1 |
|
- bootstrap.yml
1 |
server: |
- battcn-consumer
- pom.xml
1 |
<dependencies> |
- ConsumerApplication
1 |
@SpringCloudApplication |
- HiClient
1 |
package com.battcn.client; |
- HiController
1 |
package com.battcn.controller; |
- bootstrap.yml
1 |
server: |
- 测试
启动:battcn-provider
启动:battcn-consumer
访问:http://localhost:8500/ 显示如下代表服务注册成功
1 |
My Name's :battcn-provider Email:1837307557@qq.com #正确情况 |
1 |
fallback... #错误情况,阻断输出fallback... |
- 解锁新姿势
- 异常处理
画图工具:https://www.processon.com/
如果我们
FeignClient
服务都是内部的,在客户端抛出异常直接往最外层抛出,就不需要在消费者通过硬编码处理了,关键代码(完整代码看GIT)…
battcn-provider
中异常处理
1 |
@ExceptionHandler(value = Exception.class) |
battcn-consumer
中异常处理
1 |
@ExceptionHandler(value = Exception.class) |
在
Hystrix
中只有,HystrixBadRequestException
是不会被计数,也不会进入阻断器,所以我们定义一个自己的错误解码器
- FeignServiceErrorDecoder
1 |
package com.battcn.config; |
- 测试
1 |
My Name's :battcn-provider Email:1837307557@qq.com #正确情况 |
1 |
{"customCode":400,"message":"请求错误"} #抛出异常,而不是进入阻断器 |
关闭battcn-provider:http://localhost:8766/h1
1 |
fallback... #服务down机,阻断输出fallback... |
- Request 参数传递
在开发中难免会有 服务之间 请求头传递比如Token,ID,因为我们使用的是
FeignClient
的方式,那么我们无法获得HttpServletRequest
的上下文,这个时候怎么办呢?通过硬编码是比较low
的一种,接下来为各位看官带来简单粗暴的(也就知道这种,还有其它简单的方式欢迎交流….)
- FeignRequest(consumer)
1 |
package com.battcn.config; |
- HelloController(provider)
1 |
@Value("${spring.application.name}") |
- 测试
结果:My Name's :battcn-provider Token:5588551D64C8478BA681A35892A03437
代表我们Token(HttpServletRequest)传递成功…
