本文主要介绍zuul的基本原理和在sprngcloud服务下如何使用
一、简单介绍
Zuul 是 Netflix OSS 中的一员,是一个基于 JVM 路由和服务端的负载均衡器。提供路由、监控、弹性、安全等方面的服务框架。Zuul 能够与 Eureka、Ribbon、Hystrix 等组件配合使用。
Zuul 的核心是过滤器,通过这些过滤器我们可以扩展出很多功能,比如:
1)动态路由
动态地将客户端的请求路由到后端不同的服务,做一些逻辑处理,比如聚合多个服务的数据返回。
2)请求监控
可以对整个系统的请求进行监控,记录详细的请求响应日志,可以实时统计出当前系统的访问量以及监控状态。
3)认证鉴权
对每一个访问的请求做认证,拒绝非法请求,保护好后端的服务。
4)压力测试
压力测试是一项很重要的工作,像一些电商公司需要模拟更多真实的用户并发量来保证重大活动时系统的稳定。通过 Zuul 可以动态地将请求转发到后端服务的集群中,还可以识别测试流量和真实流量,从而做一些特殊处理。
5)灰度发布
灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
二、使用Zuul构建微服务网关——路由配置
首先,基于前几篇springcloud搭建的基础之上,这里借助了已经注册进eureka中心的web服务study-web,端口是8002,已添加了一个方法
1、创建一个新的maven项目,这里命名为study-zuul,选中zuul
2、导入依赖
3、添加配置文件,使用Eureka负载路由
注:如果不想依赖于eureka使用zuul,那么可以使用 zuul.routes.study-web.url=http://localhost:8002/
4、启动类上添加注解 @EnableZuulProxy和@EnableEurekaClient
5、启动eureka中心,study-web,study-zuul,访问http://localhost:8005/study-web/hello,结果显示:
三、Zuul容错机制超时重试
容错,简单来说就是当某个服务不可用时,能够切换到其他可用的服务上去,也就是需要有重试机制。在 Zuul 中开启重试机制需要依赖 spring-retry。
1、Spring-cloud中的zuul网关重试机制是使用spring-retry实现的,需要在pom.xml中添加spring-retry
2、配置文件
3、在zuul中可配置的超时时间有两个位置,ribbon和hystrix,hystrix配置如下:
4、启动eureka中心、study-zuul,study-web,study-ms,study-toms,访问http://localhost:8005/study-web/test,ribbon负载两个服务器
刷新时轮询显示:
停掉一个服务器8004之后多次刷新显示:
总结:没加重试机制之前,当你请求接口的时候肯定有一次是会被转发到停掉的服务上去的,返回的是异常信息。
当我们加入了重试机制后,你可以循环请求接口,这个时候不会返回异常信息,因为 Ribbon 会根据重试配置进行重试,当请求失败后会将请求重新转发到可用的服务上去。
四,Zuul的回退方法
添加回退方法是因为在通过网关访问服务器的时候,如果服务器断开,会直接返回一个回退的信息
1、首先创建一个类,去实现FallbackProvider 接口
package com.study.controller; import com.google.common.collect.ImmutableMap; import com.google.gson.GsonBuilder; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; 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 java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.time.LocalDateTime; @Component public class FallBack implements FallbackProvider { @Override public String getRoute() { return null; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { String result = new GsonBuilder().create().toJson(ImmutableMap.of("errorCode", 500, "content", "请求失败", "time", LocalDateTime.now())); return new ByteArrayInputStream(result.getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8")); headers.setContentType(mt); return headers; } }; } }
2、测试,启动eureka中心、study-zuul,study-web,study-ms,访问http://localhost:8005/study-web/queryUser
将study-ms服务断开,刷新显示会有回退信息:
5、Zuul的过滤器
1)、首先,创建一个新的类,这里命名为MyFilter,继承ZuulFilter,进而去实现ZuulFilter类里的方法,主要有以下四种方法
filterType()方法是指过滤器类型选择:
●pre 为路由前
●route 为路由过程中
●post 为路由过程后
●error 为出现错误的时候
同时也支持static ,返回静态的响应,详情见StaticResponseFilter的实现
filterOrder()方法指的是过滤器的执行顺序,数值越小,优先级越高。
shouldFilter()是否通过这个过滤器,默认为true,改成false则不启用
2)、实现方法
3)、测试,启动eureka中心、study-zuul,study-web,study-ms,用postman测试,不传accessToken参数,访问http://localhost:8005/study-web/queryUser,结果:
传accessToken参数后,继续访问http://localhost:8005/study-web/queryUser,结果显示: