很多时候, 由于服务的重启, 宕机或者网络的不佳, Zuul 进行路由时会出现异常, 然后, 异常信息直接展示给用户是不友好的, 需要我们提示一些通俗易懂的信息告知用户为什么会出现失败, 这时就可以用到回退处理, SpringCloud 中使用 Hystrix 实现微服务的容错与回退, 其实 Zuul 默认已经整合了 Hystrix
本文讲解 Zuul 如何实现回退策略, Hystrix 组件不了解的话大家可以前往我的这篇文章: SpringCloud 组件之 Hystrix
一, 实现 FallbackProvider 接口
本文用的 Zuul 服务为前几篇文章所搭建的, 这里不在搭建 Zuul 服务, 对 Zuul 不了解的话可以查看之前的文章: SpringCloud 组件之 Zuul
- /**
- * @author Gjing
- **/
- @Component
- public class GlobalFallback implements FallbackProvider {
- /**
- * 这里配置是为哪个服务提供回退,* 号代表所有服务
- */
- @Override
- public String getRoute() {
- return "*";
- }
- /**
- * 回退返回
- */
- @Override
- public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
- return new ClientHttpResponse() {
- @Override
- @NonNull
- public HttpStatus getStatusCode() throws IOException {
- return HttpStatus.BAD_REQUEST;
- }
- @Override
- public int getRawStatusCode() throws IOException {
- return HttpStatus.BAD_REQUEST.value();
- }
- @Override
- @NonNull
- public String getStatusText() throws IOException {
- return HttpStatus.BAD_REQUEST.getReasonPhrase();
- }
- @Override
- public void close() {
- }
- @Override
- @NonNull
- public InputStream getBody() throws IOException {
- return new ByteArrayInputStream("服务器异常请稍后再试".getBytes(StandardCharsets.UTF_8));
- }
- @Override
- @NonNull
- public HttpHeaders getHeaders() {
- HttpHeaders httpHeaders = new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON);
- return httpHeaders;
- }
- };
- }
- }
相关方法介绍
方法名 | 说明 |
---|---|
getRoute | 为哪个服务提供回退,* 号代表所有服务 |
fallbackResponse | 回退响应 |
getStatusCode | 回退时的状态码 |
getRawStatusCode | 数字类型状态码 |
getStatusText | 状态文本 |
close | 这个不用管 |
getBody | 响应体 |
getHeaders | 返回的响应头 |
二, 配置超时时间
- # 负载均衡超时时间设置
- ribbon:
ReadTimeout: 读超时时间 (单位毫秒)
socketTimeOut: 连接超时时间 (单位毫秒)
注意!!!: 如果 zuul 配置了熔断 fallback 的话, 熔断超时也要配置, 不然如果你配置的 ribbon 超时时间大于熔断的超时 (Hystirx 超时默认 1 秒), 那么会先走熔断, 相当于你配的 ribbon 超时就不生效了, ribbon 和 hystrix 是同时生效的, 哪个值小哪个生效, 另一个就看不到效果了.
- hystrix:
- command:
- # default 为默认所有, 可以配置指定服务名
- default:
- execution:
- isolation:
- thread:
timeoutInMilliseconds: 超时时间 (单位毫秒)
三, 启动 Eureka,Zuul 和一个 web 服务, 并在 Web 服务接口设置线程休眠, 模拟超时, 当请求实际达到设置的超时时间后会进行回退
本文到此就结束了, 合理的配置超时时间和回退, 有助于让程序体验性更好哦, 具体还是要视实际业务场景而定哦, 本 Demo 源代码地址为: SpringCloud-Demo
来源: https://yq.aliyun.com/articles/707102