一、Zuul简介
1.1、概述
Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.
Zuul是一种网关服务,可提供动态路由,监控,弹性,安全性等。
GitHub:https://github.com/Netflix/zuul
1.2、主要功能
二、Zuul的快速入门
2.1、引入相关的依赖
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>SpringCloud_Demo</artifactId>
<groupId>cn.waggag.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>zuul_service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--引入zuul的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--引入eureka的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
2.2、启动类开启注解
//开启Zuul的代理
@EnableZuulProxy
2.3、配置文件中的基本配置
server:
port: 9000
spring:
application:
name: zuul-service
#配置注册的eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8083/eureka/
#配置网关
zuul:
routes:
#简化配置,配置需要的路径
user-service: /**
#配置不想暴露的服务
ignored-services:
- consumer-service
三、Zuul的过滤器
Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个我们往往是通过Zuul提供的过滤器来实现的。
3.1、编写一个简单的登陆过滤器
package cn.waggag.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class LoginFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
//获取请求上下文
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
//获取请求参数
String token = request.getParameter("access-token");
//判断是否存在
if(StringUtils.isBlank(token)){
//不存在,拦截
requestContext.setSendZuulResponse(false);
//返回403
requestContext.setResponseStatusCode(HttpStatus.SC_FORBIDDEN);
}
return null;
}
}
3.2、访问不带token
3.3、访问携带token
3.4、负载均衡和熔断
Zuul中默认已经集成了Ribbon负载均衡和Hystrix熔断器,但是所有的都是默认值,比较短,必须手动设置较大的值
#设置hystrix的超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
#配置ribbon的超时
ribbon:
ConnectionTimeout: 5000
ReadTimeout: 2000
MaxAutoRetriesNextServer: 0 #不重试
3.5、Zuul的高可用
启动多个Zuul的服务,自动注册到Eureka,形成集群。