SpringCloud-Zuul服务网关[容错Hystrix]

400 阅读2分钟

zuul作为网关服务,用来分配调度其他服务的,那么难免就会出现调用的服务出现问题的请求,或者用户访问急剧增多的情况,那么此时我们的网关服务就应该具有容错能力,zuul本身也考虑到了这点,所以默认集成的有Hystrix。

一、zuul 和 hystrix 无缝结合

  在 zuul 的 jar 包中包含了 hystrix 的 jar 包。所以我们不需要在项目中添加 Hystrix 的坐标。

在这里插入图片描述

二、访问网关服务的数据监控流

  启动我们的provider的服务和网关服务后,就可以查看到对应的数据监控流了,如下:

在这里插入图片描述

在这里插入图片描述

三、启动dashboard-view服务可视化查看

  启动dashboard-view服务我们可以很方便的查看监视的数据,

在这里插入图片描述

四、服务降级处理

  接下来我们看下在网关服务中怎么实现服务的降级处理

1.创建项目

在这里插入图片描述

2.pom文件

<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>

3.配置文件

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/

4.添加ProviderProductFallback类

  创建一个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服务,启动网关服务访问查看:

在这里插入图片描述