您的位置:首页 > 编程语言 > Java开发

springCloud学习04之api服务网关zuul回退fallback

2017-08-11 14:56 726 查看
     在前面学习hystrix的时候,我们知道hystrix有fallback回退能力,及如果服务调用出现了异常,则执行指定的fallback方法。那现在zuul对api服务集群进行了反向代理,集成了hystrix,那zuul也能fallback了。

     在上一篇博文中,已经建立有zuul项目了,复制一份命名为zuul-fallback,pom.xml,application.properties不需要变,新创建类ServerFallback.java  

完整代码在github上 

package com.fei.springcloud.fallback;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;

/**
* 向用户管理api-user-server路由发起请求失败时的回滚处理
* hystrix的回滚能力
* @author Jfei
*
*/
@Component
public class ServerFallback implements ZuulFallbackProvider{

@Override
public String getRoute() {
return "api-user-server";//api服务id,如果需要所有调用都支持回退,则return "*"或return null
}
/**
* 如果请求用户服务失败,返回什么信息给消费者客户端
*/
@Override
public ClientHttpResponse fallbackResponse() {

return new ClientHttpResponse(){

@Override
public InputStream getBody() throws IOException {
JSONObject r = new JSONObject();
r.put("state", "9999");
r.put("msg", "系统错误,请求失败");
return new ByteArrayInputStream(r.toJSONString().getBytes("UTF-8"));
}

@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
//和body中的内容编码一致,否则容易乱码
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}

/**
* 网关向api服务请求是失败了,但是消费者客户端向网关发起的请求是OK的,
* 不应该把api的404,500等问题抛给客户端
* 网关和api服务集群对于客户端来说是黑盒子
*/
@Override
public HttpStatus getStatusCode() throws IOException {

return HttpStatus.OK;
}

@Override
public int getRawStatusCode() throws IOException {

return HttpStatus.OK.value();
}

@Override
public String getStatusText() throws IOException {

return HttpStatus.OK.getReasonPhrase();
}

@Override
public void close() {

}

};
}

}


启动eureka服务,启动zuul-fallback,eureka-api,请求访问http://127.0.0.1:8888/user-api/user/find/1,得到正常结果;把eureka-api服务停止掉。稍等一会,刷新页面,得到就是ServerFallback中指定的返回的内容。
   如果把ServerFallback.java去掉,会发现页面得到的时候异常信息,zuul的日志或控制台打印refuse connection的异常信息。

    既然zuul集成了hystrix,那hystrix的dashboard也是可以集成的了,pom.xml中加入

<!-- 健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- hystrix dashboard的支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>application.properties中,可以设置dashboard的刷新频率
#hystrix dashboard的信息收集频率,默认500毫秒
hystrix.stream.dashboard.intervalInMilliseconds=5000

启动类中添加 @EnableHystrixDashboard

其他的和之前学习hystrix的监控一样查看了,这里就不重复了。
完整源码 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: