zuul作为网关服务,用来分配调度其他服务的,那么难免就会出现调用的服务出现问题的请求,或者用户访问急剧增多的情况,那么此时我们的网关服务就应该具有容错能力,zuul本身也考虑到了这点,所以默认集成的有Hystrix。
在 zuul 的 jar 包中包含了 hystrix 的 jar 包。所以我们不需要在项目中添加 Hystrix 的坐标。
启动我们的provider的服务和网关服务后,就可以查看到对应的数据监控流了,如下:
启动dashboard-view服务我们可以很方便的查看监视的数据,
接下来我们看下在网关服务中怎么实现服务的降级处理
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<groupId>com.bobo</groupId>
<artifactId>zuul-gateway-fallback</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring.application.name=zuul-gateway-fallback
server.port=9030
#\u8BBE\u7F6E\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740\uFF0C\u6307\u5411\u53E6\u4E00\u4E2A\u6CE8\u518C\u4E2D\u5FC3
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/
创建一个java类,实现ZuulFallbackProvider接口,并重写相关方法,具体如下:
package com.bobo.zuul.fallback;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
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;
/**
* 商品服务的服务降级的工具类
*
* @author dengp
*
*/
@Component
public class ProviderProductFallback implements ZuulFallbackProvider {
@Override
public ClientHttpResponse fallbackResponse() {
// 设置降级后给客户端响应的信息
return new ClientHttpResponse() {
/**
* 设置相关的header信息
*/
@Override
public HttpHeaders getHeaders() {
HttpHeaders header = new HttpHeaders();
// 返回json数据
MediaType mt = new MediaType("application","json",Charset.forName("utf-8"));
header.setContentType(mt);
return header;
}
/**
* 设置响应的内容
*/
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("product服务不可用,请于管理员联系!".getBytes());
}
/**
* 返回状态码
*/
@Override
public String getStatusText() throws IOException {
// TODO Auto-generated method stub
return this.getStatusCode().getReasonPhrase();
}
@Override
public HttpStatus getStatusCode() throws IOException {
// TODO Auto-generated method stub
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
// TODO Auto-generated method stub
return this.getStatusCode().value();
}
@Override
public void close() {
}
};
}
/**
* 对哪个服务做降级处理
*/
@Override
public String getRoute() {
return "e-book-product";
}
}
关闭provider服务,启动网关服务访问查看: