springCloud(16):使用Zuul构建微服务网关-容错回退与高可用

1、容错与回退java

1.一、容错spring

在Spring Cloud中,Zuul默认已经整合了Hystrix。json

测试:后端

 a、依次启动eureka-server(4010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)、hystrix-dashboard(5013)app

 b、访问http://localhost:5016/hystrix-consumer-movie/user/1,可正常获取结果负载均衡

 c、访问http://localhost:5016/hystrix.stream,可获取监控数据maven

 d、访问http://localhost:5013/hystrix,并在监控地址栏上填写http://localhost:5016/hystrix.streamide

   wKiom1meQMLwlBE5AACDHygJFG8679.png

   总结:Zuul的Hystrix监控的粒度是微服务,而不是某个API;同时也说明,全部通过Zuul的请求,都会被Hystrix保护起来微服务

 e、关闭hystrix-consumer-movie,再次访问http://localhost:5016/hystrix-consumer-movie/user/1,将会出现异常。那么如何为zuul实现回退呢?测试

1.二、为Zuul添加回退

要为Zuul添加回退,须要实现ZuulFallBackProvider接口。在实现类中指定为哪一个微服务提供回退,并提供一个ClientHttpResponse做为回退响应。

a、新建一个maven工程、添加zuul依赖,此处端口为5018

b、新建回退类

package com.liuy.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;

/**
 * 电影微服务添加回退
 * @description 电影微服务添加回退
 * @author luis
 * @version 1.0
 * @date:2017年8月24日上午11:11:23
 */
@Component
public class MovieFallBack implements ZuulFallbackProvider {

    @Override
    public String getRoute() {
        // 代表是哪一个微服务提供回退
	return "hystrix-consumer-movie";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
	    @Override
	    public HttpHeaders getHeaders() {
	        // headers设定
		HttpHeaders headers = new HttpHeaders();
		MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));
		headers.setContentType(mt);
		return headers;
	    }
			
	    @Override
	    public InputStream getBody() throws IOException {
	        // 响应体
		return new ByteArrayInputStream("电影微服务不可用,请稍后再试。".getBytes());
	    }
			
	    @Override
	    public String getStatusText() throws IOException {
	        // 状态文本,此处返的OK,详见HttpStatus
		return this.getStatusCode().getReasonPhrase();
	    }
			
	    @Override
	    public HttpStatus getStatusCode() throws IOException {
	        // fallback时的状态码
	        return HttpStatus.OK;
	    }
			
	    @Override
	    public int getRawStatusCode() throws IOException {
	        // 数字类型的状态码,此处返的200,详见HttpStatus
	        return this.getStatusCode().value();
	    }
			
	    @Override
	    public void close() {
	    }
	};
    }
}

c、关闭hystrix-consumer-movie,再次访问http://localhost:5018/hystrix-consumer-movie/user/1

 wKiom1mlEsKAtzXHAAAU3qXOuB4043.png

2、Zuul的高可用

zuul的高可用很是关键,由于外部请求到后端微服务的流量都会通过Zuul。在生产环境中通常都须要部署高可用的Zuul以免单点故障。

2.一、Zuul客户端注册到了Eureka Server上

这种状况下,Zuul的高可用很是简单,只须将多个Zuul节点注册到Eureka Server上,就可实现Zuul的高可用。此时,Zuul的高可用与其它微服务的高可用没啥区别。


当Zuul客户端也注册到Eureka Server上时,只须部署多个Zuul节点便可实现高可用。Zuul客户端会自动从Eureka Server上查询Zuul Server的列表,并使用Ribbon负载均衡的请求Zuul集群。

 wKiom1mlGDjxdU2kAABl7tsigck885.png

2.二、Zuul客户端没有注册到Eureka Server上

这种状况可用使用负载均衡器来实现Zuul高可用,如:Nginx


Zuul客户端将请求发送到负载均衡器上,而后负载均衡器将请求转发到其代理的其中一个Zuul节点,这样也能够实现Zuul的高可用。

相关文章
相关标签/搜索